Tüm java dosyalarını belirli bir dizin altında yinelemeli olarak derlemek için javac seçeneği


127

Projemde java dosyalarını derlemek için javac derleyicisini kullanıyorum. Dosyaları bu gibi çeşitli paketler üzerinde dağıtılır: com.vistas.util, com.vistas.converter, com.vistas.LineHelper, com.current.mdcontect.

Bu paketlerin her birinin birkaç java dosyası vardır. Ben javac'ı şöyle kullanıyorum:

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(tek satırda)

Bu kadar çok yol vermek yerine, derleyiciden tüm java dosyalarını ana com dizininden yinelemeli olarak derlemesini nasıl isteyebilirim?


2
Ant veya Maven gibi araçlara gerçekten bir göz atmalısınız.
Laurent Pireyn

Bu SO gönderisi yararlı olabilir stackoverflow.com/questions/864630/…
Gopi

Yanıtlar:


220

Ayrıca, bir tür derleme aracı ( Ant veya Maven , Ant zaten önerilmiştir ve başlaması daha kolaydır) veya derlemeyi yöneten bir IDE (Eclipse uzlaştırma stratejisi ile artan derleme kullanır ve bunu yapmak zorunda bile değilsiniz) kullanmanızı öneririm . herhangi bir "Derleme" düğmesine basmaya özen gösterin ).

Javac'ı kullanma

Daha büyük bir proje için bir şeyler denemeniz gerekiyorsa ve yakınlarda herhangi bir uygun inşa aracınız yoksa, her zaman javacsunan küçük bir numara kullanabilirsiniz : derlenecek sınıf adları bir dosyada belirtilebilir. Dosyanın adını önek javacile @aktarmanız yeterlidir .

*.javaProjenizdeki tüm dosyaların bir listesini oluşturabilirseniz , bu kolaydır:

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • Avantajı , hızlı ve kolay bir çözüm olmasıdır.
  • Bunun dezavantajı , sources.txtyeni bir kaynak oluşturduğunuzda veya mevcut bir dosyayı yeniden adlandırdığınızda, unutması kolay (dolayısıyla hataya açık) ve yorucu bir iş olan dosyayı yeniden oluşturmanız gerektiğidir.

Bir derleme aracı kullanma

Uzun vadede, yazılım oluşturmak için tasarlanmış bir araç kullanmak daha iyidir.

Karınca Kullanımı

Yazılımın build.xmlnasıl oluşturulacağını açıklayan basit bir dosya oluşturursanız :

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

Aşağıdaki komutu çalıştırarak tüm yazılımı derleyebilirsiniz:

$ ant
  • Avantajı , genişletmesi kolay standart bir oluşturma aracı kullanıyor olmanızdır.
  • Bunun dezavantajı , ek bir araç indirmeniz, kurmanız ve öğrenmeniz gerektiğidir. IDE'lerin çoğunun (NetBeans ve Eclipse gibi) derleme dosyaları yazmak için harika destek sunduğunu ve bu durumda hiçbir şey indirmenize gerek kalmadığını unutmayın.

Maven'i kullanma

Maven kurmak ve çalışmak için o kadar da önemsiz değil, ama onu öğrenmek iyi para kazanıyor. İşte 5 dakika içinde bir projeye başlamak için harika bir öğretici .

  • Benim için ana avantajı , bağımlılıkları da yönetmesidir, bu nedenle daha fazla Jar dosyası indirmenize ve bunları elle yönetmenize gerek kalmayacak ve daha büyük projeleri oluşturmak, paketlemek ve test etmek için daha kullanışlı buldum.
  • Dezavantajı , dik bir öğrenme eğrisine sahip olmasıdır ve Maven eklentileri hataları bastırmayı seviyorsa :-) Diğer bir şey de, Maven depolarıyla ( Scala için Sbt , Ant için Ivy , Groovy için Graddle gibi) çok sayıda aracın da çalışmasıdır. .

IDE kullanmak

Artık geliştirme verimliliğinizi artırabilecek şey. Oldukça popüler ve güçlü olan birkaç açık kaynak alternatifi ( Eclipse ve NetBeans gibi, eskisini tercih ederim) ve hatta ticari olanlar ( IntelliJ gibi ) var.

Proje yapısını arka planda yönetebilirler, böylece tüm komut satırı işleriyle uğraşmak zorunda kalmazsınız. Ancak, arka planda gerçekte ne olduğunu biliyorsanız, her zaman işe yarar , böylece a ClassNotFoundException.

Ek bir not

Daha büyük projeler için her zaman bir IDE ve bir inşa aracı kullanılması önerilir . İlki üretkenliğinizi artırırken, ikincisi projeyle farklı IDE'lerin kullanılmasını mümkün kılar (örneğin, Maven basit bir mvn eclipse:eclipsekomutla Eclipse proje tanımlayıcıları oluşturabilir ). Dahası, tek bir satır komutuyla test edilebilen / oluşturulabilen bir projeye sahip olmak, yeni meslektaşlara ve örneğin sürekli bir entegrasyon sunucusuna tanıtmak kolaydır. Kekin parçası :-)


4
Kullanırken javacbir çıktı dizini belirtmek daha iyi olur. find -name "*.java" > sources.txt && javac -d bin @sources.txt. Aksi takdirde * .class dosyaları, kaynakların bulunduğu dizine kaydedilir.
Maksim Dmitriev

1
Kesinlikle doğru. Her ne kadar benim düşünceme göre, birileri yeni oynamaya başladıysa javac, kavramı, CLASSPATHkodun nasıl çalıştırılacağı java, paketlerle nasıl başa çıkılacağı, hangisinin çalıştırmak için kök klasör olması gerektiği vb. Genellikle net değildir. Böylece çıktı dizinini atladım. Her neyse, öneri için teşekkürler!
rlegendi

6
Bununla karşılaşan mac kullanıcıları için findkomut şu find . -name "*.java" > sources.txt.
şekildedir

@MrDuk "." yapmak? Mevcut dizinde aramak için mi?
Brady Sheehan

@BradySheehan verilen yoldan aramaya başlayacaktır. "" mevcut sözlükten başlamak anlamına gelir. O Not var (OS X) Bulma işlemi için bir yol belirtmek
Kris

40
find . -name "*.java" -print | xargs javac 

Biraz acımasız ama cehennem gibi çalışıyor. (Yalnızca küçük programlarda kullanın, kesinlikle verimli değildir)


1
Bunu kullanırsanız find ... -print0, xargs -0 ...bunun yerine dosya adlarındaki boşlukları
bölmemeyi düşünün

29

Kabuğunuz destekliyorsa, bunun gibi bir şey çalışır mı?

javac com/**/*.java 

Kabuğunuz desteklemiyorsa **, belki

javac com/*/*/*.java

çalışır (3 bileşenli tüm paketler için - aşağı yukarı uyarlayın).


Bunu Windows 10'daki komut isteminde kullanmaya çalıştım. Birisi Windows 10'da çalışıp çalışmadığını veya yanlış yapıyorsam lütfen onaylayabilir mi
Dan

26

Tüm projenizi derlemek istediğiniz olağan durumda, javac'ı ana sınıfınızla birlikte sağlayabilir ve gerekli tüm bağımlılıkları derlemesine izin verebilirsiniz:

javac -sourcepath . path/to/Main.java


Çok basit bir yöntem, ekstra dosyalar dayanmaz
linquize

Bu, Ant'ı (benim gibi) öğrenmek için fazla vakti olmayan insanlar için en iyi ve en basit olanı
Hamza Abbad

Maalesef tembellik. Dokunmazsanız Main.java, ki bu muhtemelen ikinci dosyanızı oluşturduktan sonra yapmazsınız, başka hiçbir şey derleyici almaz.
Tom Hawtin - tackline

Burada da iyi çalışmıyor. Bazı bağımlılıklar değiştirilmesine rağmen yeniden derlenmez. @ TomHawtin-tackline Daha önce ana üzerinde dokunmayı denedim ama hiçbir şey. Belki hepsine dokunmak gerekir. Yine de biraz garip.
mmm

5

javac -cp "jar_path/*" $(find . -name '*.java')

(Xargs'ı kullanmamayı tercih ederim çünkü onları bölebilir ve javac'ı birden çok kez çalıştırabilir, her biri bir java dosyası alt kümesine sahiptir, bazıları aynı javac komut satırında belirtilmeyen diğerlerini içe aktarabilir)

Bir App.java giriş noktanız varsa, ucubenin -kaynak yolu ile yolu en iyisidir. İçe aktarma bağımlılıklarını izleyerek ihtiyaç duyduğu diğer tüm java dosyalarını derler. Örneğin:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

Ayrıca hedef sınıf dosyası dir belirtebilirsiniz: -d target/.


3

Karınca kullanmayı öğrenmenizi tavsiye ederimBu görev için çok uygun olan, çok kolay ve iyi belgelenmiş olan .

Build.xml dosyasında bunun gibi bir hedef tanımlamanız gerekir:

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>

2

Sadece şuna benzeyen basit bir makefile ile make kullanıyorum:

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

Kaynakları birer birer derler ve yalnızca gerekirse yeniden derler.


1

javac komutu özyinelemeli bir derleme sürecini izlemez, bu nedenle, komutu çalıştırırken her bir dizini belirtmeniz veya dahil etmek istediğiniz dizinleri içeren bir metin dosyası sağlamanız gerekir:

javac -classpath "${CLASSPATH}" @java_sources.txt

0

Test sınıflarımı yinelemeli olarak oluşturmak için bunu bir Xcode JNI projesinde kullanıyorum:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.