Apakah ada cara untuk memasukkan semua file jar ke dalam direktori di classpath?
Saya mencoba java -classpath lib/*.jar:. my.package.Program
dan tidak dapat menemukan file kelas yang pasti ada di toples tersebut. Apakah saya perlu menambahkan setiap file jar ke classpath secara terpisah?
java
command-line
classpath
Chris Serra
sumber
sumber
.jar
bagian, (2) harus memiliki setidaknya 2 bagian, dipisahkan oleh;
pada Windows (yang biasanya di:
tempat lain). Misalnya:java -classpath ".;lib/*" Program
Jawaban:
Menggunakan Java 6 atau lebih baru, opsi classpath mendukung wildcard. Perhatikan yang berikut ini:
"
)*
, bukan*.jar
Windows
Unix
Ini mirip dengan Windows, tetapi menggunakan
:
bukan;
. Jika Anda tidak dapat menggunakan wildcard,bash
memungkinkan sintaks berikut (di manalib
direktori berisi semua file arsip Java):(Perhatikan bahwa menggunakan classpath tidak kompatibel dengan
-jar
opsi. Lihat juga: Jalankan file jar dengan beberapa pustaka classpath dari command prompt )Memahami Wildcard
Dari dokumen Classpath :
Catatan: karena bug yang dikenal di java 8, contoh windows harus menggunakan backslash sebelumnya dengan tanda bintang tambahan: https://bugs.openjdk.java.net/browse/JDK-8131329
sumber
tr
works!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
tanpa tanda kutip dan berfungsi dengan baik. Saya bertanya-tanya mengapa shell tidak mengembangkannya dan gagal?~
di -cpDi bawah windows ini berfungsi:
dan ini tidak berfungsi:
perhatikan * .jar, jadi * wildcard harus digunakan sendiri .
Di Linux, yang berikut ini berfungsi:
Pemisah adalah titik dua bukan titik koma.
sumber
*.jar
tetapi hanya dengan*
.:
satu platform dan;
lainnya. :) Saya mengkompilasi dengan Java dari baris perintah sekitar sekali per tahun, hanya cukup untuk tidak mengingat seberapa sering cukup mengganggu.Kami mendapatkan sekitar masalah ini dengan mengerahkan utama file jar
myapp.jar
yang berisi manifest (Manifest.mf
) berkas menentukan classpath dengan guci diperlukan lainnya, yang kemudian dikerahkan samping itu. Dalam hal ini, Anda hanya perlu mendeklarasikanjava -jar myapp.jar
saat menjalankan kode.Jadi jika Anda menyebarkan utama
jar
ke beberapa direktori, dan kemudian menempatkan stoples dependen ke dalamlib
folder di bawahnya, manifes terlihat seperti:NB: ini adalah platform-independen - kita dapat menggunakan guci yang sama untuk diluncurkan pada server UNIX atau pada PC Windows.
sumber
Solusi saya di Ubuntu 10.04 menggunakan java-sun 1.6.0_24 memiliki semua toples di direktori "lib":
Jika ini gagal, perintah berikut ini akan berfungsi (mencetak semua * .ar di direktori lib ke param classpath)
sumber
Jawaban singkat:
java -classpath lib/*:. my.package.Program
Oracle menyediakan dokumentasi tentang penggunaan wildcard di classpath di sini untuk Java 6 dan di sini untuk Java 7 , di bawah bagian heading Memahami wildcard jalur kelas . (Saat saya menulis ini, dua halaman berisi informasi yang sama.) Berikut ini ringkasan dari hal-hal penting:
Secara umum, untuk memasukkan semua JAR dalam direktori yang diberikan, Anda dapat menggunakan wildcard
*
( tidak*.jar
).Wildcard hanya cocok dengan JAR, bukan file kelas; untuk mendapatkan semua kelas dalam direktori, akhiri saja entri classpath di nama direktori.
Dua opsi di atas dapat digabungkan untuk menyertakan semua file JAR dan kelas dalam direktori, dan aturan presedensi classpath biasa berlaku. Misalnya
-cp /classes;/jars/*
Wildcard tidak akan mencari JAR di subdirektori.
Poin-poin di atas adalah benar jika Anda menggunakan
CLASSPATH
properti sistem atau-cp
atau-classpath
perintah bendera baris. Namun, jika Anda menggunakanClass-Path
header manifest JAR (seperti yang mungkin Anda lakukan dengan file build semut), wildcard tidak akan dihormati.Ya, tautan pertama saya adalah yang sama dengan yang disediakan dalam jawaban skor teratas (yang saya tidak punya harapan menyalip), tetapi jawaban itu tidak memberikan banyak penjelasan di luar tautan. Karena perilaku semacam itu tidak disarankan pada Stack Overflow hari ini , saya pikir saya akan mengembangkannya.
sumber
Windows :
Linux :
Ingatkan:
- Pemisah jalur Windows adalah
;
- Pemisah jalur Linux
:
- Di Windows jika argumen cp tidak mengandung spasi, "tanda kutip" adalah opsional
sumber
Bagi saya ini bekerja di windows.
Untuk linux
Saya menggunakan Java 6
sumber
Anda dapat mencoba java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlDirektori untuk guci eksternal saat menjalankan java
sumber
-Djava.ext.dirs=
BEFORE-jar
Benar :
Salah:
sumber
Jika Anda benar-benar perlu menentukan semua file .jar secara dinamis, Anda bisa menggunakan skrip shell, atau Apache Ant . Ada proyek commons yang disebut Commons Launcher yang pada dasarnya memungkinkan Anda menentukan skrip startup Anda sebagai file build semut (jika Anda melihat apa yang saya maksud).
Kemudian, Anda dapat menentukan sesuatu seperti:
Dalam file build peluncuran Anda, yang akan meluncurkan aplikasi Anda dengan classpath yang benar.
sumber
Jika Anda menggunakan Java 6, maka Anda dapat menggunakan wildcard di classpath.
Sekarang dimungkinkan untuk menggunakan wildcard dalam definisi classpath:
Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
sumber
Harap dicatat bahwa ekspansi wildcard rusak untuk Java 7 di Windows.
Lihat masalah StackOverflow ini untuk informasi lebih lanjut.
Solusinya adalah dengan meletakkan titik koma tepat setelah wildcard.
java -cp "somewhere/*;"
sumber
Untuk Perhatian,
Saya menemukan perilaku aneh ini di Windows di bawah shell MSYS / MinGW.
Bekerja:
Tidak bekerja:
Saya cukup yakin bahwa wildcard tidak diperluas oleh shell, karena mis
(Mencobanya dengan program lain juga, bukan built-in
echo
, dengan hasil yang sama.)Saya percaya bahwa itu
javac
yang mencoba mengembangkannya, dan itu berperilaku berbeda apakah ada titik koma dalam argumen atau tidak. Pertama, mungkin mencoba untuk memperluas semua argumen yang terlihat seperti jalur. Dan hanya pada saat itu akan mengurai mereka, dengan-cp
hanya mengambil token berikut. (Perhatikan bahwa itucom.comsol.aco_1.0.0.jar
adalah JAR kedua dalam direktori itu.) Itu semua dugaan.Ini adalah
sumber
Semua solusi di atas bekerja dengan baik jika Anda mengembangkan dan menjalankan aplikasi Java di luar IDE seperti Eclipse atau Netbeans.
Jika Anda menggunakan Windows 7 dan menggunakan Eclipse IDE untuk Development di Java, Anda mungkin mengalami masalah jika menggunakan Command Prompt untuk menjalankan file kelas yang dibuat di dalam Eclipse.
Misalnya kode sumber Anda di Eclipse memiliki hierarki paket berikut: edu.sjsu.myapp.Main.java
Anda memiliki json.jar sebagai ketergantungan eksternal untuk Main.java
Ketika Anda mencoba menjalankan Main.java dari dalam Eclipse, itu akan berjalan tanpa masalah.
Tetapi ketika Anda mencoba menjalankan ini menggunakan Command Prompt setelah mengkompilasi Main.java di Eclipse, itu akan menembak beberapa kesalahan aneh yang mengatakan "ClassNotDef Error blah blah".
Saya berasumsi Anda berada di direktori kerja kode sumber Anda !!
Gunakan sintaks berikut untuk menjalankannya dari command prompt:
[Jangan lewatkan. atas]
Ini karena Anda telah menempatkan Main.java di dalam paket edu.sjsu.myapp dan java.exe akan mencari pola yang tepat.
Semoga ini bisa membantu !!
sumber
Untuk windows diperlukan dan; harus digunakan sebagai pemisah. misalnya:
sumber
Short Form: Jika main Anda berada di dalam toples, Anda mungkin memerlukan '-jar pathTo / yourJar / YourJarsName.jar' tambahan secara eksplisit dinyatakan untuk membuatnya berfungsi (meskipun 'YourJarsName.jar' ada di classpath) (atau , diekspresikan untuk menjawab pertanyaan awal yang diajukan 5 tahun lalu: Anda tidak perlu mendeklarasikan ulang setiap toples secara eksplisit, tetapi memang terlihat, bahkan dengan java6 Anda perlu mendeklarasikan toples Anda sendiri ...)
Long Form: (Saya sudah membuat ini eksplisit ke titik yang saya harap bahkan interlopers ke java dapat memanfaatkan ini)
Seperti banyak di sini saya menggunakan gerhana untuk mengekspor guci: (File-> Ekspor -> 'Runnable JAR File'). Ada tiga opsi pada penawaran 'Library handling' eclipse (Juno):
Biasanya saya akan menggunakan opt2 (dan opt1 benar-benar melanggar), namun kode asli di salah satu guci yang saya gunakan saya menemukan istirahat dengan trik "jarinjar" berguna yang memanfaatkan gerhana ketika Anda memilih opsi itu. Bahkan setelah menyadari bahwa saya memerlukan opt3, dan kemudian menemukan entri StackOverflow ini, saya masih butuh waktu untuk memikirkannya cara meluncurkan utama saya di luar gerhana, jadi inilah yang bekerja untuk saya, karena ini berguna bagi orang lain ...
Jika Anda memberi nama toples Anda: "fooBarTheJarFile.jar" dan semuanya diatur untuk diekspor ke dir: "/ theFully / kualifikasiPath / toYourChosenDir".
(artinya bidang 'Tujuan ekspor' akan bertuliskan: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')
Setelah Anda menekan finish, Anda akan menemukan eclipse kemudian menempatkan semua pustaka ke dalam folder bernama 'fooBarTheJarFile_lib' dalam direktori ekspor itu, memberi Anda sesuatu seperti:
Anda kemudian dapat meluncurkan dari mana saja di sistem Anda dengan:
(Untuk Java Newbies: 'package.path_to.the_class_with.your_main' adalah paket-path yang dideklarasikan yang akan Anda temukan di bagian atas file 'TheClassWithYourMain.sain' yang berisi argumen 'main (String []) {.. .} 'yang ingin Anda jalankan dari luar java)
Jebakan untuk diperhatikan: adalah memiliki 'fooBarTheJarFile.jar' dalam daftar toples di classpath yang Anda nyatakan tidak cukup. Anda harus secara eksplisit mendeklarasikan '-jar', dan mendeklarasikan ulang lokasi toples itu.
misalnya ini rusak:
disajikan kembali dengan jalur relatif:
(menggunakan versi java "1.6.0_27"; melalui OpenJDK 64-Bit Server VM di ubuntu 12.04)
sumber
Satu-satunya cara saya tahu bagaimana melakukannya secara individual, misalnya:
Semoga itu bisa membantu!
sumber
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
kelas dari wepapp:
sumber
Anda harus menambahkan semuanya secara terpisah. Atau, jika Anda benar - benar perlu hanya menentukan direktori, Anda dapat mencabut semuanya menjadi satu dir dan menambahkannya ke classpath Anda. Namun saya tidak merekomendasikan pendekatan ini karena Anda berisiko mengalami masalah aneh dalam versi classpath dan tidak dapat dikelola.
sumber
Bukan solusi langsung untuk dapat mengatur / * ke -cp tapi saya harap Anda bisa menggunakan skrip berikut untuk sedikit meringankan situasi untuk jalur kelas dinamis dan direktori lib.
Scripted untuk Linux, bisa memiliki yang serupa untuk windows juga. Jika direktori yang tepat disediakan sebagai input ke "libDir2Scan4jars"; skrip akan memindai semua toples dan membuat string classpath dan mengekspornya ke variabel env "tmpCLASSPATH".
sumber
macOS, folder saat ini
Untuk Java 13 di macOS Mojave …
Jika semua
.jar
file Anda berada di folder yang sama, gunakancd
untuk menjadikannya direktori kerja Anda saat ini . Verifikasi denganpwd
.Untuk itu
-classpath
Anda harus terlebih dahulu mendaftar file JAR untuk aplikasi Anda. Menggunakan karakter titik dua:
sebagai pembatas, tambahkan tanda bintang*
untuk mendapatkan semua file JAR lainnya dalam folder yang sama. Terakhir, berikan nama paket lengkap kelas dengan metode Andamain
.Misalnya, untuk aplikasi dalam file JAR yang dinamai
my_app.jar
denganmain
metode di kelas yang disebutkanApp
dalam paket bernamacom.example
, di samping beberapa toples yang diperlukan di folder yang sama:sumber
Pikirkan file jar sebagai root dari struktur direktori. Ya, Anda harus menambahkan semuanya secara terpisah.
sumber
Atur classpath dengan cara yang sesuai beberapa guci dan file kelas direktori saat ini.
sumber
Saya memiliki beberapa botol dalam folder. Perintah di bawah ini berfungsi untuk saya
JDK1.8
untuk memasukkan semua toples yang ada di folder. Harap dicatat bahwa untuk memasukkan dalam tanda kutip jika Anda memiliki ruang di classpathWindows
Kompilasi:
javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java
Berlari:
java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram
Linux
Kompilasi:
javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java
Berlari:
java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram
sumber
Saya mencoba menjalankan file Java baik sebagai jar atau sebagai kelas di Ubuntu. Saya gagal di kedua opsi. Pengecualian berikut adalah outputnya.
atau
atau
Saya menemukan jawabannya:
Kebodohan saya.
Langkah pertama: Anda harus mengatur Java yang sesuai: Saya memiliki Java 11 tetapi saya menetapkan Java lib path versi ke-8! - Anda dapat mengatur versi Java dari sini:
Langkah 2: Kemudian jalankan perintah berikut, dengan mengubah path dan nama file ke path dan file yang sesuai:
Itu dijalankan dengan sukses!
sumber