Pertanyaan Termasuk semua guci dalam direktori di dalam classpath Java


Apakah ada cara untuk memasukkan semua file jar dalam direktori di classpath?

Saya mencoba java -classpath lib/*.jar:. my.package.Program dan tidak dapat menemukan file kelas yang pasti ada dalam guci tersebut. Apakah saya perlu menambahkan setiap file jar ke classpath secara terpisah?


844
2017-10-20 19:32


asal


Jawaban:


Menggunakan Java 6 atau yang lebih baru, opsi classpath mendukung wildcard. Perhatikan hal-hal berikut:

  • Gunakan kutipan lurus (")
  • Menggunakan *tidak *.jar

Windows

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

Ini mirip dengan Windows, tetapi menggunakan : dari pada ;. Jika Anda tidak dapat menggunakan wildcard, bash memungkinkan sintaks berikut (di mana lib adalah direktori yang berisi semua file arsip Java):

java -cp $(echo lib/*.jar | tr ' ' ':')

(Perhatikan bahwa menggunakan classpath tidak kompatibel dengan -jar pilihan. Lihat juga: Jalankan file jar dengan beberapa pustaka classpath dari command prompt)

Memahami Wildcard

Dari Classpath dokumen:

Entri jalur kelas dapat berisi karakter wildcard basename *, yang dianggap setara dengan menentukan daftar semua file   di direktori dengan ekstensi .jar atau .JAR. Misalnya,   masuk jalur kelas foo/* menentukan semua file JAR di direktori bernama   foo. Entri classpath yang hanya terdiri dari * meluas ke daftar semua   file jar di direktori saat ini.

Entri jalur kelas yang berisi * tidak akan cocok dengan file kelas. Untuk   cocokkan kedua kelas dan file JAR dalam satu direktori foo, gunakan juga    foo;foo/* atau foo/*;foo. Perintah yang dipilih menentukan apakah   kelas dan sumber daya di foo dimuat sebelum file JAR masuk foo, atau   dan sebaliknya.

Subdirektori tidak ditelusuri secara rekursif. Sebagai contoh, foo/* terlihat   untuk file JAR hanya di foo, tidak masuk foo/bar, foo/baz, dll.

Urutan di mana file JAR dalam sebuah direktori disebutkan di   jalur kelas diperluas tidak ditentukan dan dapat bervariasi dari platform ke   platform dan bahkan dari waktu ke waktu pada mesin yang sama. SEBUAH   aplikasi yang dibangun dengan baik tidak boleh bergantung pada sesuatu yang khusus   memesan. Jika pesanan tertentu diperlukan maka file JAR bisa   disebutkan secara eksplisit di jalur kelas.

Perluasan wildcard dilakukan lebih awal, sebelum doa a   metode utama program, daripada terlambat, selama kelas-loading   proses itu sendiri. Setiap elemen dari jalur kelas masukan yang berisi a   wildcard digantikan oleh urutan elemen (mungkin kosong)   dihasilkan dengan menyebutkan file JAR di direktori bernama. Untuk   Misalnya, jika direktori foo mengandung a.jar, b.jar, dan c.jar, kemudian   jalur kelas foo/* diperluas menjadi foo/a.jar;foo/b.jar;foo/c.jar,   dan string itu akan menjadi nilai dari properti sistem    java.class.path.

Itu CLASSPATH variabel lingkungan tidak diperlakukan berbeda dari   itu -classpath (atau -cp) opsi baris perintah. Artinya, wildcard adalah   dihormati dalam semua kasus ini. Namun, wildcard jalur kelas tidak   dihormati di Class-Path jar-manifesttajuk.

Catatan: karena bug yang dikenal di java 8, contoh windows harus menggunakan entri sebelumnya backslash dengan tanda bintang trailing: https://bugs.openjdk.java.net/browse/JDK-8131329


976
2017-10-20 20:32



Di bawah jendela ini berfungsi:

java -cp "Test.jar;lib/*" my.package.MainClass

dan ini tidak berhasil:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

perhatikan * .jar, jadi * wildcard harus digunakan sendiri.


Di Linux, pekerjaan berikut ini:

java -cp "Test.jar:lib/*" my.package.MainClass

Pemisah adalah titik dua bukan titik koma.


199
2017-08-14 00:42



Kami mengatasi masalah ini dengan menerapkan utama file jar myapp.jar yang berisi nyata (Manifest.mf) file yang menentukan classpath dengan guci lainnya yang diperlukan, yang kemudian ditempatkan di sampingnya. Dalam hal ini, Anda hanya perlu menyatakan java -jar myapp.jar saat menjalankan kode.

Jadi jika Anda menyebarkan yang utama jar ke beberapa direktori, dan kemudian menempatkan guci tergantung ke dalam lib folder di bawahnya, manifesnya terlihat seperti:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

NB: ini platform-independen - kita dapat menggunakan guci yang sama untuk diluncurkan pada server UNIX atau pada PC Windows.


59
2017-10-20 20:08



Solusi saya pada Ubuntu 10.04 menggunakan java-sun 1.6.0_24 memiliki semua guci di direktori "lib":

java -cp.: lib / * my.main.Class

Jika ini gagal, perintah berikut harus bekerja (mencetak semua * .jars dalam direktori lib ke param classpath)

java -cp $ (untuk i dalam lib / *. jar; do echo -n $ i:; selesai). my.main.Class

36
2018-03-17 10:55



Jawaban singkat: java -classpath lib/*:. my.package.Program

Oracle menyediakan dokumentasi tentang penggunaan wildcard di dalam classpaths di sini untuk Java 6 dan di sini untuk Java 7, di bawah judul bagian Memahami wildcard jalur kelas. (Saat saya menulis ini, dua halaman berisi informasi yang sama.) Berikut ringkasan highlights:

  • Secara umum, untuk memasukkan semua JARs dalam direktori tertentu, Anda dapat menggunakan wildcard * (tidak  *.jar).

  • Wildcard hanya cocok dengan JAR, bukan file kelas; untuk mendapatkan semua kelas dalam direktori, cukup akhiri entri classpath pada nama direktori.

  • Dua opsi di atas dapat digabungkan untuk menyertakan semua file JAR dan kelas dalam direktori, dan aturan aturan yang diberlakukan classpath biasa berlaku. Misalnya. -cp /classes;/jars/*

  • Wildcard akan tidak cari JARs di subdirektori.

  • Poin-poin di atas benar jika Anda menggunakan CLASSPATH properti sistem atau -cp atau -classpath bendera baris perintah. Namun, jika Anda menggunakan Class-Path Header manifes JAR (seperti yang mungkin Anda lakukan dengan file build semut), wildcard akan tidak merasa terhormat.

Ya, tautan pertama saya adalah tautan yang sama yang diberikan dalam jawaban top-skor (yang saya tidak punya harapan untuk menyalip), tetapi jawaban itu tidak memberikan banyak penjelasan di luar tautan. Karena perilaku semacam itu putus asa di Stack Overflow hari ini, Saya pikir saya akan memperluasnya.


27
2017-12-21 19:32



Bagi saya ini bekerja di windows.

java -cp "/lib/*;" sample

Untuk linux

java -cp "/lib/*:" sample

saya menggunakan Java 6


27
2017-10-15 07:43



Anda dapat mencoba java -Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

Direktori untuk guci eksternal saat menjalankan java


21
2018-03-06 21:00



Benar:

java -classpath "lib/*:." my.package.Program

Salah:

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

20
2018-02-13 17:57



Windows:
 java -cp file.jar; dir / * my.app.ClassName

Linux:
java -cp file.jar: dir / * my.app.ClassName

Mengingatkan:
- Windows pemisah jalur adalah ";"
- Linux pemisah jalur adalah ":"
- Di Windows jika argumen cp tidak berisi spasi putih, "tanda kutip" adalah opsional


13
2017-07-18 19:03