Termasuk semua stoples dalam direktori di dalam classpath Java


1019

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

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


3
Maaf saya tidak pernah menerima ini. Seharusnya wiki komunitas. Tidak pernah menggunakan salah satu jawaban yang disediakan. Saya percaya saya membuat skrip shell yang baru saja memindai direktori lib / dan membuat classpath dari parsing nama file.
Chris Serra

Ada beberapa jenis bug di fitur Java baru ini, karena tidak berfungsi seperti yang dijelaskan. Saya menyerah dan menggunakan Semut untuk mengatasinya, seperti yang dijelaskan dalam salah satu jawaban.
Alex R


1
Ada masalah dengan pemrosesan wildcard di Windows. stackoverflow.com/questions/11607873/…
Mykhaylo Adamovych

6
Jawaban singkat: (1) jatuhkan .jarbagian, (2) harus memiliki setidaknya 2 bagian, dipisahkan oleh ;pada Windows (yang biasanya di :tempat lain). Misalnya:java -classpath ".;lib/*" Program
Evgeni Sergeev

Jawaban:


1160

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

  • Gunakan kutipan langsung ( ")
  • Gunakan *, bukan*.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 :bukan ;. Jika Anda tidak dapat menggunakan wildcard, bashmemungkinkan sintaks berikut (di mana libdirektori berisi semua file arsip Java):

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

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

Memahami Wildcard

Dari dokumen Classpath :

Entri jalur kelas dapat berisi karakter wildcard nama dasar *, yang dianggap setara dengan menentukan daftar semua file dalam direktori dengan ekstensi .jaratau .JAR. Sebagai contoh, entri jalur kelas foo/*menentukan semua file JAR di direktori bernama foo. Entri classpath hanya terdiri dari *memperluas ke daftar semua file jar di direktori saat ini.

Entri jalur kelas yang berisi *tidak akan cocok dengan file kelas. Untuk mencocokkan file kelas dan JAR dalam satu direktori foo, gunakan salah satu foo;foo/*atau foo/*;foo. Urutan yang dipilih menentukan apakah kelas dan sumber daya di foodimuat sebelum file JAR masuk foo, atau sebaliknya.

Subdirektori tidak dicari secara rekursif. Misalnya, foo/*penampilan untuk file JAR hanya dalam foo, tidak dalam foo/bar, foo/bazdll

Urutan di mana file JAR dalam direktori disebutkan dalam jalur kelas yang diperluas tidak ditentukan dan dapat bervariasi dari platform ke platform dan bahkan dari waktu ke waktu pada mesin yang sama. Aplikasi yang dibangun dengan baik tidak boleh bergantung pada urutan tertentu. Jika diperlukan perintah tertentu maka file JAR dapat disebutkan secara eksplisit di jalur kelas.

Perluasan wildcard dilakukan lebih awal, sebelum doa metode utama program, daripada terlambat, selama proses pemuatan kelas itu sendiri. Setiap elemen dari jalur kelas input yang berisi wildcard digantikan oleh urutan (mungkin kosong) elemen yang dihasilkan dengan menghitung file JAR dalam direktori yang disebutkan. Misalnya, jika direktori fooberisi a.jar,, b.jardan c.jar, maka jalur kelas foo/*diperluas ke foo/a.jar;foo/b.jar;foo/c.jar, dan string itu akan menjadi nilai properti sistem java.class.path.

The CLASSPATHvariabel lingkungan tidak diperlakukan berbeda dari -classpath(atau -cp) opsi baris perintah. Artinya, wildcard dihormati dalam semua kasus ini. Namun, wildcard jalur kelas tidak dihormati di Class-Path jar-manifestheader.

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


2
Fitur ini didokumentasikan dengan buruk, dan tampaknya membutuhkan beberapa pra-kondisi yang tidak jelas untuk dipenuhi agar dapat berfungsi sebagaimana dimaksud.
Alex R

1
+1 untuk trik bash / tr terakhir. Java / JamVM di sini tidak suka wildcard untuk path di luar direktori kerja, tetapi secara eksplisit mereferensikan setiap JAR menggunakan shell wildcard + trworks!
Supr

1
Saya memiliki perintah java -classpath /jars/*:/anotherJarsDir/* com.test.MyClasstanpa tanda kutip dan berfungsi dengan baik. Saya bertanya-tanya mengapa shell tidak mengembangkannya dan gagal?
yellavon

3
Juga jangan gunakan ~di -cp
Sohail Si

1
Contoh windows Anda tidak bekerja dengan java 8 atau yang lebih lama, tetapi akan dengan classpath ini: Test.jar; lib \ * ... forward slash tidak apa-apa kecuali ketika sebelum tanda bintang dan beberapa lainnya ... lihat bugs.openjdk. java.net/browse/JDK-8131329
philwalk

226

Di bawah windows ini berfungsi:

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

dan ini tidak berfungsi:

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

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


Di Linux, yang berikut ini berfungsi:

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

Pemisah adalah titik dua bukan titik koma.


17
Jawaban sempurna. 2 hal penting yang perlu diperhatikan: 1) Gunakan tanda kutip dan 2) Gunakan * saja, bukan * .jar
Wim Deblauwe

4
Setahun dan 8 bulan kemudian, edit yang saya buat untuk menyertakan versi UNIX menyelamatkan saya lagi. :) Lucu bagaimana ia tidak mengenali file jar saya dengan *.jartetapi hanya dengan *.
jmort253

Saya menemukan bahwa urutan classpath penting (tapi saya tidak tahu mengapa). Saya mendapatkan kesalahan sampai saya mengubah urutan classpath.
user13107

@ jmort253, masalahnya, ini bukan shell * yang mengembang, tapi wildcard java mengurai classpath, melihat * dan mengisi wildcard
Sebastian

1
@ SebastianGodelet - Yeh, itu hanya saya yang bingung antara wildcard Regex dan notasi ini, yang tidak sama saya kira. Sebagian besar, yang menyelamatkan saya adalah mengetahui perbedaan antara :satu platform dan ;lainnya. :) Saya mengkompilasi dengan Java dari baris perintah sekitar sekali per tahun, hanya cukup untuk tidak mengingat seberapa sering cukup mengganggu.
jmort253

67

Kami mendapatkan sekitar masalah ini dengan mengerahkan utama file jar myapp.jaryang berisi manifest ( Manifest.mf) berkas menentukan classpath dengan guci diperlukan lainnya, yang kemudian dikerahkan samping itu. Dalam hal ini, Anda hanya perlu mendeklarasikan java -jar myapp.jarsaat menjalankan kode.

Jadi jika Anda menyebarkan utama jarke beberapa direktori, dan kemudian menempatkan stoples dependen ke dalam libfolder di bawahnya, manifes terlihat seperti:

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

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


Ini tampaknya bekerja untuk banyak orang, namun, Java tampaknya mengabaikan entri Class-Path dalam file manifes di sini. Kami tidak dapat menjalankan aplikasi tanpa menambahkan "lib / *" secara manual ke classpath menggunakan -cp. Ada ide?
Raku

6
Jawaban oxbow_lakes tidak sepenuhnya benar; hal Class-Path dihormati (dan HANYA yang dihormati; -cp / -classpath diabaikan!) jika Anda memulai toples ini dengan java -jar myapp.jar. Saya kira oxbow_lakes bermaksud menulis bahwa ketika ia menulis 'java -classpath myapp.jar'.
rzwitserloot

47

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

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

Jika ini gagal, perintah berikut ini akan berfungsi (mencetak semua * .ar di direktori lib ke param classpath)

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

4
catatan lucu. java -cp lib / * my.main.Class akan selalu gagal karena shell glob ekspansi lib / *, sedangkan java -cp.: lib / * my.main.Class tidak akan karena.: lib / * bukan glob yang valid jalan. Luangkan waktu untuk mencatat bahwa
albfan

1
Ini tidak bekerja; linux akan memperluas . Anda dapat mencoba: java -cp '.: lib / ' dan itu berfungsi dengan baik (perhatikan tanda kutip tunggal! Ini tidak akan bekerja dengan tanda kutip ganda!). Sebenarnya,.: Lib / * mungkin berfungsi jika itu bukan bola yang sah karena usus besar, tetapi rasanya agak rapuh. Saya akan menambahkan tanda kutip. Kutipan tunggal memberitahu bash untuk tidak menyentuh bagian mana pun dari konten.
rzwitserloot

Tidak masalah (dalam konteks ini) jika Anda menggunakan tanda kutip tunggal atau ganda. Anda ingin mencegah shell dari memperluas (globbing) *, itu saja. Dan berikan teks "lib / *" secara litteral ke JVM, sehingga VM mengenali ini sebagai "pola khusus" dan mencari sendiri file jar.
Angel O'Sphere

36

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 CLASSPATHproperti sistem atau -cpatau -classpathperintah bendera baris. Namun, jika Anda menggunakan Class-Pathheader 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.


masalah saya adalah dengan lib / *. jar daripada lib / *. Terima kasih banyak, ini memperbaikinya. Saya perhatikan ada perbedaan antara: dan; tapi itu bisa jadi semacam pengujian saya-banyak-perubahan-pada-saat-sama.
Eyad Ebrahim

Terima kasih telah menekankan perbedaan antara * dan * .jar
burakhan alkan

36

Windows :

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

Linux :

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

Ingatkan:
- Pemisah jalur Windows adalah ;
- Pemisah jalur Linux:
- Di Windows jika argumen cp tidak mengandung spasi, "tanda kutip" adalah opsional


Contoh windows tidak berfungsi untuk java 8 dan sebelumnya: lihat bugs.openjdk.java.net/browse/JDK-8131329
philwalk

Mungkin tidak bekerja untuk JDK terbuka, saya akan menguji ini dan saya akan bicarakan di sini
Wender

Maaf, saya melakukan tes dengan HotSpot dan saya pikir itu berfungsi dengan openjdk.
Wender

Oracle java di bawah windows memerlukan backslash sebelum tanda bintang daripada garis miring, meskipun saya belum menguji ulang versi java terbaru atau alternatif.
philwalk

tidak berfungsi pada makro
Greyshack


29

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


3
Ini berhasil, tapi hati-hati, lewati -Djava.ext.dirs=BEFORE-jar
Giovanni Funchal

5
java.ext.dirs akan bekerja sangat berbeda dari stoples normal di classpath. Ini memiliki prioritas dan izin yang lebih tinggi yang akan dapat menimpa entah bagaimana kelas di bootstamp (rt.jar)
Dennis C

Terima kasih. Pada 'versi java "1.8.0_221" Java (TM) SE Runtime Environment (build 1.8.0_221-b27) Java HotSpot (TM) 64-Bit Server VM (build 25.221-b27, mode campuran)', hanya ini -D versi lewat di jalan setapak bekerja. Bentuk tradisional tidak.
Matt Campbell

23

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

9

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:

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

Dalam file build peluncuran Anda, yang akan meluncurkan aplikasi Anda dengan classpath yang benar.



8

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/*;"


6

Untuk Perhatian,

Saya menemukan perilaku aneh ini di Windows di bawah shell MSYS / MinGW.

Bekerja:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

Tidak bekerja:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

Saya cukup yakin bahwa wildcard tidak diperluas oleh shell, karena mis

$ echo './*'
./*

(Mencobanya dengan program lain juga, bukan built-in echo, dengan hasil yang sama.)

Saya percaya bahwa itu javacyang 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 -cphanya mengambil token berikut. (Perhatikan bahwa itu com.comsol.aco_1.0.0.jaradalah JAR kedua dalam direktori itu.) Itu semua dugaan.

Ini adalah

$ javac -version
javac 1.7.0

5

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:

  1. javac -cp ".; json.jar" Main.java

  2. java -cp ".; json.jar" edu.sjsu.myapp.Main

    [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 !!


4

Untuk windows diperlukan dan; harus digunakan sebagai pemisah. misalnya:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

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):

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

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:

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

Anda kemudian dapat meluncurkan dari mana saja di sistem Anda dengan:

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(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:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

disajikan kembali dengan jalur relatif:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(menggunakan versi java "1.6.0_27"; melalui OpenJDK 64-Bit Server VM di ubuntu 12.04)


3

Satu-satunya cara saya tahu bagaimana melakukannya secara individual, misalnya:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

Semoga itu bisa membantu!


Ini mungkin satu-satunya jalan kembali di '08, tetapi sekarang tidak lagi.
simo.3792

Ini bukan yang terburuk. Ini hack, tapi saya punya set ini di bashrc sayafor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

kelas dari wepapp:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

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.


3
Ini mungkin satu-satunya jalan kembali di '08, tetapi sekarang tidak lagi.
simo.3792

2

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.

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

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".


2

macOS, folder saat ini

Untuk Java 13 di macOS Mojave

Jika semua .jarfile Anda berada di folder yang sama, gunakan cduntuk menjadikannya direktori kerja Anda saat ini . Verifikasi denganpwd .

Untuk itu -classpathAnda 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.jardengan mainmetode di kelas yang disebutkan Appdalam paket bernama com.example, di samping beberapa toples yang diperlukan di folder yang sama:

java -classpath my_app.jar:* com.example.App

tidak berfungsi untuk java 8
Greyshack

1

Pikirkan file jar sebagai root dari struktur direktori. Ya, Anda harus menambahkan semuanya secara terpisah.


1

Atur classpath dengan cara yang sesuai beberapa guci dan file kelas direktori saat ini.

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

Saya memiliki beberapa botol dalam folder. Perintah di bawah ini berfungsi untuk sayaJDK1.8 untuk memasukkan semua toples yang ada di folder. Harap dicatat bahwa untuk memasukkan dalam tanda kutip jika Anda memiliki ruang di classpath

Windows

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


-1

Saya mencoba menjalankan file Java baik sebagai jar atau sebagai kelas di Ubuntu. Saya gagal di kedua opsi. Pengecualian berikut adalah outputnya.

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetric

atau

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

atau

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

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:

  sudo update-alternatives --config java

Langkah 2: Kemudian jalankan perintah berikut, dengan mengubah path dan nama file ke path dan file yang sesuai:

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

Itu dijalankan dengan sukses!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.