Jalankan file JAR dari baris perintah dan tentukan classpath

115

Saya telah menyusun file JAR dan menentukan Kelas-Utama dalam manifes (saya menggunakan fungsi Ekspor Eclipse ). Semua dependensi saya ada di direktori berlabel lib. Sepertinya saya tidak bisa mendapatkan jawaban langsung tentang cara mengeksekusi file JAR saya sementara menentukannya harus menggunakan lib/*sebagai classpath.

Saya sudah mencoba:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

dll ...

Masing-masing memberikan kesalahan yang mengatakan:

Error: Could not find or load main class ....

atau memberi NoClassDefFoundErrorindikasi bahwa perpustakaan tidak ditemukan.

Saya bahkan mencoba membuat ulang file JAR dan memasukkan libdirektori dan isinya, tetapi tetap tidak ada dadu ...

Bagaimana saya dapat menjalankan file JAR dari baris perintah dan menentukan classpath yang akan digunakan?

SnakeDoc
sumber

Jawaban:

204

Jika Anda tentukan -jar, -cpparameter akan diabaikan.

Dari dokumentasi :

Saat Anda menggunakan opsi ini, file JAR adalah sumber dari semua kelas pengguna, dan pengaturan jalur kelas pengguna lainnya akan diabaikan.

Anda juga tidak dapat "menyertakan" file jar yang diperlukan ke dalam file jar lain (Anda perlu mengekstrak isinya dan memasukkan file .class ke dalam file jar Anda)

Anda memiliki dua pilihan:

  1. sertakan semua file jar dari libdirektori ke dalam manifes (Anda dapat menggunakan jalur relatif di sana)
  2. Tentukan semuanya ( termasuk jar Anda) pada baris perintah menggunakan -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
seekor kuda tanpa nama
sumber
22
; bukannya: jika Anda menggunakan windows sebagai berikut java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Error
Anda juga tidak dapat "menyertakan" file jar yang dibutuhkan ke dalam file jar lain. Tentu kamu bisa. Jika ini untuk penggunaan internal (yaitu, Anda mengharapkan pengguna memiliki beberapa keterampilan teknis, dll.) Anda dapat meminta agar langkah 1, sebelum mencoba menjalankan toples, adalah untuk dijalankan unzip MyJar.jar lib/*.jar. Kemudian, seperti yang Anda sarankan, mereka dapat berlarijava -cp MyJar.jar:lib/* ...
Roger
3
Sayangnya, ini adalah kasus penggunaan umum untuk menjalankan jar uber "semua termasuk" dengan referensi ke file properti khusus server eksternal. Jelas bukan pemblokir, tetapi tentu saja perintah yang kurang bertele-tele jika Anda dapat menggunakan -jar dan tidak harus menentukan yang utama
Andrew Norman
Butuh beberapa saat untuk mencari tahu. Dan membutuhkan sekitar 6 baris untuk memuat file log4j secara eksplisit. Bug Java lain yang tidak akan pernah bisa diperbaiki.
Tuntable
1
Perhatikan bahwa Class-Path manifesst hanya dapat digunakan untuk memuat file jar. Ini tidak dapat digunakan untuk mencari log4j3.xml, misalnya. Membuat saya baik.
Tuntable
34

Jalankan file jar dan tentukan jalur kelas seperti ini:

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar adalah nama lengkap JAR yang ingin Anda jalankan

libs/* adalah jalur ke JAR ketergantungan Anda

com.test.Appadalah nama kelas yang sepenuhnya memenuhi syarat dari JAR yang memiliki main(String[])metode

Jar dan jar dependen harus memiliki izin eksekusi.

Sid
sumber
10

Anda dapat melakukan ini di unix shell:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Anda dapat melakukan ini di windows PowerShell:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
ter
sumber
4

Atau, gunakan manifes untuk menentukan jalur-kelas dan kelas-utama jika Anda mau, jadi Anda tidak perlu menggunakan -cpatau menentukan kelas utama. Dalam kasus Anda, itu akan berisi baris seperti ini:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

Sayangnya, Anda perlu mengeja setiap jar dalam manifes (bukan masalah besar karena Anda hanya melakukannya sekali, dan Anda dapat menggunakan skrip untuk membuat file atau menggunakan fitur build seperti ANT atau Maven atau Gradle). Dan referensinya harus berupa direktori relatif atau absolut tempat Anda menjalankan file java -jar MyJar.jar.

Kemudian jalankan dengan

java -jar MyJar.jar
HankCa
sumber
Saya pikir Class-Path perlu merujuk ke file di dalam toples luar. Saya tidak bisa mendapatkan ini berfungsi secara umum, untuk merujuk ke file konfigurasi di luar MyJar.jar.
Tuntable
0

Anda bisa melakukan Runtime.getRuntime.exec (perintah) untuk meluncurkan kembali jar termasuk classpath dengan args.

Tim de Vries
sumber