Termasuk semua botol dalam sebuah direktori dalam classpath Java
Apakah ada cara untuk memasukkan semua jar file dalam sebuah direktori dalam classpath?
I'm mencoba java -classpath lib/*.jar:. saya.paket.Program
dan tidak dapat menemukan file kelas yang pasti di dalam toples itu. Apakah saya perlu untuk menambahkan masing-masing file jar ke classpath secara terpisah?
963
25
Menggunakan Java 6 atau yang lebih baru, classpath pilihan mendukung wildcard. Perhatikan hal berikut:
"
)*
, bukan*.jar
Windows
Unix
Hal ini mirip dengan Windows, tetapi menggunakan
:
bukan;
. Jika anda tidak dapat menggunakan wildcard,bash
yang memungkinkan sintaks berikut (di manalib
adalah direktori yang berisi semua Java file arsip):(Perhatikan bahwa menggunakan classpath adalah tidak sesuai dengan
jar
pilihan. Lihat juga: https://stackoverflow.com/questions/13018100/execute-jar-file-with-multiple-classpath-libraries-from-command-prompt)Pengertian Wildcard
Dari Classpath dokumen:
Catatan: karena bug yang dikenal dalam java 8, windows contoh harus menggunakan backslash sebelumnya entri dengan tanda asterisk: https://bugs.openjdk.java.net/browse/JDK-8131329
Di dalam windows ini bekerja:
dan ini tidak bekerja:
perhatikan *.jar, *jadi wildcard harus digunakan sendiri**.
Di Linux, karya-karya berikut:
Dengan pemisah titik, bukan tanda koma.
Kami mendapatkan sekitar masalah ini dengan mengerahkan utama file jar
myapp.jar
yang berisi nyata (Terwujud.mf
) file menentukan classpath dengan lainnya yang diperlukan dalam botol, yang kemudian disebarkan di samping itu. Dalam hal ini, anda hanya perlu untuk menyatakanjava -jar myapp.jar
ketika menjalankan kode.Jadi jika anda menyebarkan utama
jar
ke beberapa direktori, dan kemudian menempatkan tergantung guci menjadilib
folder di bawahnya, nyata terlihat seperti:NB: ini adalah platform-independen - kita dapat menggunakan guci yang sama untuk peluncuran pada server UNIX atau Windows PC.
Solusi saya di Ubuntu 10.04 menggunakan java-matahari 1.6.0_24 memiliki semua botol dalam "lib" direktori:
Jika ini gagal, berikut perintah yang harus bekerja (mencetak semua *.guci di lib direktori untuk classpath param)
Jawaban singkat:
java -classpath lib/*:. saya.paket.Program
Oracle menyediakan dokumentasi menggunakan wildcard di classpaths di sini untuk Jawa 6 dan di sini untuk Jawa 7, di bawah judul bagian Pengertian kelas jalan wildcard. (Saat saya menulis ini, dua halaman berisi informasi yang sama.) Berikut ini's ikhtisar highlights:
Secara umum, untuk mencakup semua Botol dalam direktori tertentu, anda dapat menggunakan wildcard
*
(tidak*.jar
).Wildcard hanya pertandingan Guci, bukan file kelas; untuk mendapatkan semua kelas dalam sebuah direktori, hanya akhir classpath masuk pada direktori nama.
Dua pilihan di atas dapat dikombinasikan untuk mencakup semua BOTOL dan kelas file dalam sebuah direktori, dan biasa classpath didahulukan aturan yang berlaku. E. g.
-cp /kelas;/botol/*
Wildcard akan tidak mencari Botol di subdirektori.
Di atas poin-poin yang benar jika anda menggunakan
CLASSPATH
sistem properti atau-cp
atau-classpath
command line bendera. Namun, jika anda menggunakanClass-Path
JAR mewujudkan header (seperti yang mungkin anda lakukan dengan semut membangun file), wildcard akan tidak dihormati.Yes, pertama saya link adalah salah satu yang sama yang diberikan di atas skor jawaban (yang saya tidak memiliki harapan untuk menyalip), tapi jawaban itu doesn't memberikan banyak penjelasan di luar link. Karena perilaku semacam itu adalah discouraged pada Stack Overflow hari ini, saya pikir saya'd memperluas di atasnya.
Bagi saya ini bekerja di windows .
Untuk linux
Saya menggunakan Jawa 6
Windows:
lang-bash java -cp file.jar;dir/* saya.aplikasi.ClassName
Linux:
lang-bash java -cp file.jar:dir/* saya.aplikasi.ClassName
Mengingatkan:
;
:
Anda dapat mencoba java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlDirektori eksternal guci ketika menjalankan jawa
Benar:
Salah:
Jika anda benar-benar perlu untuk menentukan semua .jar file secara dinamis anda bisa menggunakan shell script, atau [Apache Ant][1]. Ada's commons proyek yang disebut [Commons Launcher][2] yang pada dasarnya memungkinkan anda menentukan anda skrip startup seperti semut membangun file (jika anda melihat apa yang saya maksud).
Kemudian, anda dapat menentukan sesuatu seperti:
Jika anda menggunakan Java 6, maka anda dapat menggunakan wildcard dalam classpath.
Sekarang adalah mungkin untuk menggunakan wildcard di classpath definisi:
Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
Harap dicatat bahwa wildcard ekspansi rusak Java 7 pada Windows.
Check out ini StackOverflow issue untuk informasi lebih lanjut.
Pemecahan masalah adalah untuk menempatkan tanda titik koma setelah wildcard.
java -cp "di suatu tempat/*;,"
Untuk siapa ini mei kepedulian,
Saya menemukan ini perilaku aneh pada Windows di bawah MSYS/MinGW shell.
Karya:
Doesn't bekerja:
Saya cukup yakin bahwa wildcard tidak diperluas oleh shell, karena misalnya
(Mencoba dengan program lain juga, daripada built-in
echo
, dengan hasil yang sama.)Saya percaya bahwa itu's
javac
yang berusaha untuk memperluas, dan berperilaku berbeda apakah ada tanda titik koma dalam argumen atau tidak. Pertama, mungkin akan mencoba untuk memperluas semua argumen yang terlihat seperti jalan. Dan hanya kemudian akan mengurai mereka, dengan-cp
hanya mengambil berikut token. (Perhatikan bahwacom.comsol.aco_1.0.0.jar
kedua JAR di direktori tersebut.) Yang's semua menebak.Ini adalah
Semua solusi di atas bekerja dengan baik jika anda mengembangkan dan menjalankan aplikasi Java di luar IDE seperti Eclipse atau Netbeans.
Jika anda berada di Windows 7 dan menggunakan IDE Eclipse untuk Pengembangan di pulau Jawa, anda mungkin mengalami masalah jika menggunakan Command Prompt untuk menjalankan file kelas yang dibangun di dalam Eclipse.
E. g. Kode sumber anda dalam Gerhana ini memiliki paket berikut hirarki: edu.sjsu.myapp.Main.java
Anda telah json.jar sebagai eksternal ketergantungan untuk Main.java
Ketika anda mencoba menjalankan Main.java dari dalam Eclipse, itu akan berjalan tanpa masalah apapun.
Tetapi ketika anda mencoba menjalankan ini menggunakan Command Prompt setelah kompilasi Main.java di Eclipse, itu akan menembak beberapa aneh kesalahan dengan mengatakan "ClassNotDef Error bla bla".
Saya asumsikan anda di direktori kode sumber anda !!
Gunakan sintaks berikut untuk menjalankannya dari command prompt:
[Don't lewatkan . di atas]
Hal ini karena anda telah menempatkan Main.java di dalam paket edu.sjsu.myapp dan java.exe akan mencari pola yang tepat.
Semoga membantu !!
Untuk windows kutipan diperlukan dan harus digunakan sebagai pemisah. misalnya:
Bentuk pendek: Jika anda utama adalah dalam botol, anda'll mungkin perlu tambahan '-jar pathTo/yourJar/YourJarsName.jar ' menyatakan secara eksplisit untuk membuatnya bekerja (meskipun 'YourJarsName.jar' pada classpath) (atau, menyatakan untuk menjawab pertanyaan awal yang diajukan 5 tahun yang lalu: anda don't perlu redeclare masing-masing botol secara eksplisit, tetapi tidak tampak, bahkan dengan java6 yang anda butuhkan untuk redeclare anda sendiri jar ...)
Bentuk Panjang: (Saya've ini dibuat eksplisit ke titik bahwa aku bahkan berharap penyusup ke jawa bisa menggunakan ini)
Seperti banyak di sini saya'm menggunakan eclipse untuk ekspor botol: (File>Ekspor-->'Runnable JAR File'). Ada tiga pilihan pada 'Perpustakaan penanganan' gerhana (Juno) menawarkan:
Biasanya saya'd gunakan opt2 (dan opt1 pasti melanggar), namun kode asli di salah satu stoples I'm menggunakan saya menemukan istirahat dengan handy "jarinjar" trik yang gerhana memanfaatkan ketika anda memilih pilihan itu. Bahkan setelah menyadari aku yang dibutuhkan opt3, dan kemudian menemukan ini StackOverflow masuk, masih butuh beberapa waktu untuk mencari tahu bagaimana untuk memulai utama saya di luar eclipse, jadi di sini's apa yang bekerja untuk saya, karena itu's berguna bagi orang lain...
Jika anda bernama jar anda: "fooBarTheJarFile.jar" dan semua diatur untuk ekspor ke dir: "/theFully/qualifiedPath/toYourChosenDir".
(yang berarti 'tujuan Ekspor' bidang akan membaca: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar' )
Setelah anda tekan finish, anda'll menemukan eclipse kemudian menempatkan semua perpustakaan menjadi sebuah folder yang bernama 'fooBarTheJarFile_lib' hanya yang mengekspor direktori, memberikan anda sesuatu seperti:
Anda kemudian dapat memulai dari mana saja di sistem anda dengan:
(Untuk Jawa Pemula: 'paket.path_to.the_class_with.your_main' yang menyatakan paket-jalan yang kau'll menemukan di bagian atas 'TheClassWithYourMain.jawa' file yang berisi 'main(String[] args){...}' bahwa anda ingin menjalankan dari luar jawa)
Perangkap untuk melihat: adalah yang memiliki 'fooBarTheJarFile.jar' dalam daftar guci pada anda menyatakan classpath tidak cukup. Anda harus secara eksplisit menyatakan '-jar', dan redeclare lokasi yang jar.
misalnya istirahat ini:
disajikan kembali dengan path relatif:
(menggunakan java versi "1.6.0_27"; via OpenJDK 64-Bit VM Server pada ubuntu 12.04)
kelas dari wepapp:
Satu-satunya cara yang saya tahu bagaimana untuk melakukannya secara individual, misalnya:
Harapan yang membantu!
Bukan solusi langsung untuk mampu mengatur /* untuk -cp tapi saya harap anda dapat menggunakan script berikut untuk meredakan situasi sedikit untuk dinamis kelas-jalan dan direktori lib.
Scripted untuk Linux, bisa mirip satu untuk windows juga. Jika direktori yang tepat diberikan sebagai masukan untuk "libDir2Scan4jars"; script ini akan memindai semua botol dan membuat classpath string dan ekspor ke env variabel "tmpCLASSPATH".
Anda perlu menambahkan mereka semua secara terpisah. Atau, jika anda benar-benar ** hanya perlu menentukan direktori, anda dapat unjar semuanya ke dalam satu dir dan menambahkan bahwa ke classpath anda. Saya don't merekomendasikan pendekatan ini namun karena anda berisiko aneh masalah dalam classpath versi dan unmanagability.