Saya memiliki JAR dengan 4 kelas, masing-masing memiliki metode Utama. Saya ingin dapat menjalankan masing-masing sesuai kebutuhan. Saya mencoba menjalankannya dari command-line di Linux box.
E.g. The name of my JAR is MyJar.jar
Ini memiliki struktur direktori untuk kelas utama sebagai berikut:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Saya tahu bahwa saya dapat menentukan satu kelas sebagai utama dalam file Manifest saya. Tetapi apakah ada cara yang saya dapat tentukan beberapa argumen pada baris perintah untuk menjalankan kelas mana saja yang ingin saya jalankan?
Saya mencoba ini:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
Dan saya mendapat kesalahan ini:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(Pada perintah di atas, '/home/myhome/datasource.properties' dan '/home/myhome/input.txt' adalah argumen baris perintah).
java
jar
executable-jar
Bhushan
sumber
sumber
Jawaban:
Anda dapat membuat toples Anda tanpa Main-Class di file Manifest. Kemudian :
sumber
Anda bisa mengeksekusi kelas apa saja yang memiliki
public final static main
metode dari file JAR, bahkan jika file jar telahMain-Class
ditentukan .Jalankan Main-Class:
Jalankan kelas lain dengan
public static void main
metode:Catatan: penggunaan pertama
-jar
, penggunaan kedua-cp
.sumber
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
Perhatikan tanda kutip ganda di sekitar./*
mencegah mesin unix dari mengembangkannya. Perhatikan juga bahwa"./*.jar"
tidak akan berfungsi.Selain menelepon
java -jar myjar.jar com.mycompany.Myclass
, Anda juga bisa menjadikan kelas utama di kelas Manifes sebagai operator.Contoh:
sumber
Jawaban ini untuk pengguna Spring-boot:
Jika JAR Anda berasal dari
Spring-boot
proyek dan dibuat menggunakan perintahmvn package spring-boot:repackage
, metode "-cp" di atas tidak akan berfungsi. Kamu akan mendapatkan:bahkan jika Anda dapat melihat kelas dalam JAR
jar tvf yours.jar
.Dalam hal ini, jalankan kelas alternatif Anda dengan perintah berikut:
Seperti yang saya mengerti, kelas Spring-boot
org.springframework.boot.loader.PropertiesLauncher
berfungsi sebagai kelas masuk pengiriman, dan-Dloader.main
parameter mengatakan apa yang harus dijalankan.Referensi: https://github.com/spring-projects/spring-boot/issues/20404
sumber
Pertama-tama
jar
membuat toples, dan tidak menjalankannya. Cobajava -jar
saja.Kedua, mengapa Anda lulus kelas dua kali, sebagai FQCN (
com.mycomp.myproj.dir2.MainClass2
) dan sebagai file (com/mycomp/myproj/dir2/MainClass2.class
)?Edit:
Sepertinya
java -jar
membutuhkan kelas utama untuk ditentukan. Anda bisa cobajava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
saja.-cp
mengatur toples di classpath dan memungkinkan java untuk mencari kelas utama di sana.sumber
Pilihan lain yang serupa yang saya pikir Nick singgung secara singkat dalam komentar adalah untuk membuat beberapa guci pembungkus. Saya belum mencobanya, tapi saya pikir mereka bisa benar-benar kosong selain file manifes, yang harus menentukan kelas utama untuk memuat serta dimasukkannya MyJar.jar ke classpath.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
dll. Kemudian jalankan saja
java -jar MyJar2.jar
sumber
Tambahkan plugin di bawah ini dalam file pom.xml Anda dan tentukan Kelas Utama dengan nama lengkap dalam elemen.
sumber