Saya menggunakan kompiler javac untuk mengkompilasi file java di proyek saya. File-file tersebut didistribusikan melalui beberapa paket seperti ini: com.vistas.util
, com.vistas.converter
, com.vistas.LineHelper
, com.current.mdcontect
.
Masing-masing paket ini memiliki beberapa file java. Saya menggunakan javac seperti ini:
javac com/vistas/util/*.java com/vistas/converter/*.java
com.vistas.LineHelper/*.java com/current/mdcontect/*.java
(dalam satu baris)
Alih-alih memberikan begitu banyak jalur, bagaimana saya bisa meminta kompiler untuk mengkompilasi secara rekursif semua file java dari direktori com induk?
Jawaban:
Saya juga menyarankan menggunakan beberapa jenis alat build ( Ant atau Maven , Ant sudah disarankan dan lebih mudah untuk memulai dengan) atau IDE yang menangani kompilasi (Eclipse menggunakan kompilasi tambahan dengan strategi rekonsiliasi, dan Anda bahkan tidak perlu peduli untuk menekan tombol "Kompilasi" apa saja ).
Menggunakan Javac
Jika Anda perlu mencoba sesuatu untuk proyek yang lebih besar dan tidak memiliki alat build yang tepat di dekatnya, Anda selalu dapat menggunakan trik kecil yang
javac
menawarkan: nama-nama class untuk dikompilasi dapat ditentukan dalam file. Anda hanya perlu memberikan nama filejavac
dengan@
awalan.Jika Anda dapat membuat daftar semua
*.java
file di proyek Anda, mudah:sources.txt
file setiap kali Anda membuat sumber baru atau mengganti nama file yang sudah ada yang mudah dilupakan (sehingga cenderung rawan kesalahan) dan tugas yang melelahkan.Menggunakan alat membangun
Dalam jangka panjang lebih baik menggunakan alat yang dirancang untuk membangun perangkat lunak.
Menggunakan Ant
Jika Anda membuat
build.xml
file sederhana yang menjelaskan cara membuat perangkat lunak:Anda dapat mengkompilasi seluruh perangkat lunak dengan menjalankan perintah berikut:
Menggunakan Maven
Maven tidak sepele untuk mengatur dan bekerja dengan, tetapi belajar itu membayar dengan baik. Berikut tutorial yang bagus untuk memulai proyek dalam 5 menit .
Menggunakan IDE
Sekarang apa yang bisa meningkatkan produktivitas pengembangan Anda. Ada beberapa alternatif open source (seperti Eclipse dan NetBeans , saya lebih suka yang sebelumnya) dan bahkan yang komersial (seperti IntelliJ ) yang cukup populer dan kuat.
Mereka dapat mengelola bangunan proyek di latar belakang sehingga Anda tidak harus berurusan dengan semua hal-hal baris perintah. Namun, selalu berguna jika Anda tahu apa yang sebenarnya terjadi di latar belakang sehingga Anda dapat memburu kesalahan sesekali seperti a
ClassNotFoundException
.Satu catatan tambahan
Untuk proyek yang lebih besar, selalu disarankan untuk menggunakan IDE dan alat build. Yang pertama meningkatkan produktivitas Anda, sedangkan yang kedua memungkinkan untuk menggunakan IDE yang berbeda dengan proyek (misalnya, Maven dapat menghasilkan deskriptor proyek Eclipse dengan
mvn eclipse:eclipse
perintah sederhana ). Selain itu, memiliki proyek yang dapat diuji / dibangun dengan satu perintah baris mudah untuk diperkenalkan kepada kolega baru dan ke server integrasi berkelanjutan misalnya. Sepotong kue :-)sumber
javac
, akan lebih baik untuk menentukan direktori keluaran.find -name "*.java" > sources.txt && javac -d bin @sources.txt
. Kalau tidak * file .class disimpan ke direktori di mana sumbernya.javac
, konsepCLASSPATH
, cara menjalankan kodejava
, cara menangani paket, yang seharusnya menjadi folder root untuk menjalankan, dll. Biasanya tidak jelas. Jadi saya menghilangkan dir output. Bagaimanapun, terima kasih atas sarannya!find
perintahnya adalah:find . -name "*.java" > sources.txt
(perhatikan.
)Agak brutal, tetapi bekerja seperti neraka. (Gunakan hanya pada program kecil, sama sekali tidak efisien)
sumber
find ... -print0
danxargs -0 ...
bukannya untuk tidak merusak spasi dalam nama fileJika shell Anda mendukungnya, apakah sesuatu seperti ini berfungsi?
Jika shell Anda tidak mendukung
**
, maka mungkinberfungsi (untuk semua paket dengan 3 komponen - beradaptasi dengan lebih atau kurang).
sumber
Dalam kasus biasa di mana Anda ingin mengkompilasi seluruh proyek Anda, Anda bisa menyediakan javac dengan kelas utama Anda dan membiarkannya mengkompilasi semua dependensi yang diperlukan:
javac -sourcepath . path/to/Main.java
sumber
Main.java
, yang mungkin tidak akan Anda lakukan setelah membuat file kedua, tidak ada lagi yang dapat dikompilasi.javac -cp "jar_path/*" $(find . -name '*.java')
(Saya lebih suka tidak menggunakan xargs karena dapat membaginya dan menjalankan javac beberapa kali, masing-masing dengan subset file java, beberapa di antaranya mungkin mengimpor yang lain yang tidak ditentukan pada baris perintah javac yang sama)
Jika Anda memiliki titik masuk App.java, cara freaker dengan -sourcepath adalah yang terbaik. Itu mengkompilasi setiap file java lain yang dibutuhkan, mengikuti dependensi impor. misalnya:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
Anda juga dapat menentukan target kelas-berkas dir:
-d target/
.sumber
Saya menyarankan Anda untuk belajar menggunakan semut , yang sangat cocok untuk tugas ini dan sangat mudah dipahami dan didokumentasikan dengan baik.
Anda hanya perlu mendefinisikan target seperti ini di file build.xml:
sumber
Saya hanya menggunakan make dengan makefile sederhana yang terlihat seperti ini:
Ini mengkompilasi sumber satu per satu dan hanya mengkompilasi ulang jika perlu.
sumber
perintah javac tidak mengikuti proses kompilasi rekursif, jadi Anda harus menentukan setiap direktori saat menjalankan perintah, atau memberikan file teks dengan direktori yang ingin Anda sertakan:
sumber
Saya telah menggunakan ini dalam proyek Xcode JNI untuk secara rekursif membangun kelas pengujian saya:
sumber