Mam JAR z 4 klasami, z których każda ma metodę Main. Chcę móc uruchomić każdy z nich zgodnie z potrzebami. Próbuję go uruchomić z wiersza poleceń w systemie Linux.
E.g. The name of my JAR is MyJar.jar
Ma następującą strukturę katalogów dla głównych klas:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Wiem, że mogę określić jedną klasę jako główną w moim pliku manifestu. Ale czy istnieje sposób, w jaki mogę podać argument w wierszu poleceń, aby uruchomić dowolną klasę, którą chcę uruchomić?
Próbowałem tego:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
I dostałem ten błąd:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(W powyższym poleceniu argumentami wiersza poleceń są „/home/myhome/datasource.properties” i „/home/myhome/input.txt”).
java
jar
executable-jar
Bhushan
źródło
źródło
Odpowiedzi:
Możesz stworzyć swój jar bez klasy głównej w swoim pliku Manifest. Następnie :
źródło
Możesz uruchomić dowolną klasę, która ma
public final static main
metodę z pliku JAR, nawet jeśli plik jar maMain-Class
zdefiniowaną .Wykonaj klasę główną:
Wykonaj inną klasę za pomocą
public static void main
metody:Uwaga: pierwsze zastosowania
-jar
, drugie zastosowania-cp
.źródło
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
Zwróć uwagę na podwójne cudzysłowy, aby./*
uniemożliwić maszynom uniksowym jej rozwinięcie. Pamiętaj również, że"./*.jar"
to nie zadziała.Oprócz dzwonienia
java -jar myjar.jar com.mycompany.Myclass
możesz również ustawić klasę główną w swoim Manifestie jako klasę Dispatcher.Przykład:
źródło
Ta odpowiedź jest dla użytkowników Spring-boot:
Jeśli plik JAR pochodzi z
Spring-boot
projektu i został utworzony za pomocą poleceniamvn package spring-boot:repackage
, powyższa metoda „-cp” nie będzie działać. Dostaniesz:nawet jeśli możesz zobaczyć klasę w pliku JAR wg
jar tvf yours.jar
.W takim przypadku uruchom alternatywną klasę za pomocą następującego polecenia:
Jak zrozumiałem,
org.springframework.boot.loader.PropertiesLauncher
klasa Spring-boot służy jako ekspedycyjna klasa wejściowa, a klasa-Dloader.main
parametr mówi jej, co ma uruchomić.Źródła: https://github.com/spring-projects/spring-boot/issues/20404
źródło
Przede wszystkim
jar
tworzy słoik i go nie uruchamia. Próbowaćjava -jar
zamiast tego.Po drugie, dlaczego przechodzisz klasę dwukrotnie, jako FQCN (
com.mycomp.myproj.dir2.MainClass2
) i jako plik (com/mycomp/myproj/dir2/MainClass2.class
)?Edytować:
Wydaje się, że
java -jar
wymaga określenia klasy głównej. Zamiastjava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
tego możesz spróbować .-cp
ustawia jar w ścieżce klas i umożliwia javie wyszukanie tam głównej klasy.źródło
Inną podobną opcją, o której myślę, że Nick krótko wspomniał w komentarzach, jest utworzenie wielu słoików opakowaniowych. Nie próbowałem tego, ale myślę, że mogą być całkowicie puste, poza plikiem manifestu, który powinien określać główną klasę do załadowania, a także włączenie MyJar.jar do ścieżki klas.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
itd. Następnie po prostu uruchom go za pomocą
java -jar MyJar2.jar
źródło
Dodaj poniższą wtyczkę do pliku pom.xml i określ klasę główną z w pełni kwalifikowaną nazwą w elemencie.
źródło