Ich habe eine JAR mit 4 Klassen, jede hat die Hauptmethode. Ich möchte in der Lage sein, jeden von diesen nach Bedarf auszuführen. Ich versuche es von der Kommandozeile unter Linux Box auszuführen.
E.g. The name of my JAR is MyJar.jar
Die Verzeichnisstruktur für die Hauptklassen lautet wie folgt:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Ich weiß, dass ich in meiner Manifest-Datei eine Klasse als Hauptklasse angeben kann. Aber gibt es eine Möglichkeit, ein Argument in der Befehlszeile anzugeben, um die Klasse auszuführen, die ich ausführen möchte?
Ich habe es versucht:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
Und ich habe diesen Fehler bekommen:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(Im obigen Befehl sind '/home/myhome/datasource.properties' und '/home/myhome/input.txt' die Befehlszeilenargumente).
java
jar
executable-jar
Bhushan
quelle
quelle
Antworten:
Sie können Ihr Glas ohne Hauptklasse in der Manifest-Datei erstellen. Dann :
quelle
Sie können jede Klasse mit einer
public final static main
Methode aus einer JAR-Datei ausführen , auch wenn in der JAR-Datei eineMain-Class
definiert ist .Hauptklasse ausführen:
Führen Sie eine andere Klasse mit einer
public static void main
Methode aus:Hinweis: Die erste Verwendung
-jar
, die zweite Verwendung-cp
.quelle
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
Beachten Sie die doppelten Anführungszeichen, um zu./*
verhindern, dass Unix-Computer sie erweitern. Beachten Sie auch, dass dies"./*.jar"
nicht funktioniert.Neben dem Aufruf
java -jar myjar.jar com.mycompany.Myclass
können Sie auch die Hauptklasse in Ihrem Manifest zu einer Dispatcher-Klasse machen.Beispiel:
quelle
Diese Antwort richtet sich an Spring-Boot-Benutzer:
Wenn Ihre JAR aus einem
Spring-boot
Projekt stammt und mit dem Befehl erstellt wurdemvn package spring-boot:repackage
, funktioniert die obige "-cp" -Methode nicht. Sie erhalten:auch wenn Sie die Klasse in der JAR von sehen können
jar tvf yours.jar
.Führen Sie in diesem Fall Ihre alternative Klasse mit dem folgenden Befehl aus:
Wie ich verstanden habe, dient die Spring-Boot-
org.springframework.boot.loader.PropertiesLauncher
Klasse als Dispatching-Eingangsklasse, und der-Dloader.main
Parameter gibt an, was ausgeführt werden soll.Referenz: https://github.com/spring-projects/spring-boot/issues/20404
quelle
Zu allererst
jar
schafft ein Glas, und läuft es nicht. Versuchen Sie esjava -jar
stattdessen.Zweitens, warum übergeben Sie die Klasse zweimal, als FQCN (
com.mycomp.myproj.dir2.MainClass2
) und als Datei (com/mycomp/myproj/dir2/MainClass2.class
)?Bearbeiten:
Es scheint, als
java -jar
müsste eine Hauptklasse angegeben werden. Sie könnten esjava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
stattdessen versuchen .-cp
Setzt das Glas auf den Klassenpfad und ermöglicht Java, die Hauptklasse dort nachzuschlagen.quelle
Eine andere ähnliche Option, auf die Nick in den Kommentaren meiner Meinung nach kurz hingewiesen hat, ist das Erstellen mehrerer Wrapper-Gläser. Ich habe es nicht ausprobiert, aber ich denke, sie könnten vollständig leer sein, abgesehen von der Manifestdatei, in der die zu ladende Hauptklasse sowie die Aufnahme von MyJar.jar in den Klassenpfad angegeben werden sollten.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
usw. Dann führen Sie es einfach mit
java -jar MyJar2.jar
quelle
Fügen Sie das folgende Plugin in Ihre pom.xml-Datei ein und geben Sie die Hauptklasse mit dem vollständig qualifizierten Namen im Element an.
quelle