Uruchom plik JAR z wiersza poleceń i określ ścieżkę klasy

115

Skompilowałem plik JAR i określiłem klasę główną w manifeście (użyłem funkcji Eclipse Export ). Wszystkie moje zależności znajdują się w katalogu z etykietą lib. Wydaje się, że nie mogę uzyskać prostej odpowiedzi na temat sposobu wykonywania mojego pliku JAR, określając, że powinien on używać lib/*jako ścieżki klas.

Próbowałem:

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

itp...

Każdy wyświetla błąd mówiąc:

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

lub NoClassDefFoundErrorwskazuje, że biblioteki nie zostały znalezione.

Próbowałem nawet przerobić plik JAR i dołączyć libkatalog i zawartość, ale nadal nie ma kości ...

Jak mogę uruchomić plik JAR z wiersza poleceń i określić ścieżkę klasy do użycia?

SnakeDoc
źródło

Odpowiedzi:

204

Po określeniu -jarwówczas -cpparametr zostanie zignorowany.

Z dokumentacji :

W przypadku użycia tej opcji plik JAR jest źródłem wszystkich klas użytkowników, a inne ustawienia ścieżek do klas użytkowników są ignorowane.

Nie można także „dołączyć” potrzebnych plików jar do innego pliku jar (należałoby wyodrębnić ich zawartość i umieścić pliki .class w pliku jar)

Masz dwie możliwości:

  1. dołącz wszystkie pliki jar z libkatalogu do manifestu (możesz tam użyć ścieżek względnych)
  2. Określ wszystko (w tym swój jar) w linii poleceń, używając -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
koń bez imienia
źródło
22
; zamiast: jeśli używasz systemu Windows w następujący sposób java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Błąd
Nie można również „dołączać” potrzebnych plików jar do innego pliku jar. Oczywiście że możesz. Jeśli jest przeznaczony do użytku wewnętrznego (np. Oczekujesz od użytkownika pewnych umiejętności technicznych itp.), Możesz po prostu poprosić o uruchomienie kroku 1 przed próbą uruchomienia słoika unzip MyJar.jar lib/*.jar. Potem, jak sugerujesz, mogą startowaćjava -cp MyJar.jar:lib/* ...
Roger
3
problem polega na tym, że typowym przypadkiem użycia jest uruchamianie „zawierającego wszystko” Uber jar z odniesieniem do zewnętrznego pliku właściwości specyficznych dla serwera. Oczywiście nie jest to bloker, ale z pewnością mniej rozwlekłe polecenie, gdybyś mógł użyć -jar i nie musisz określać głównego
Andrew Norman
Zajęło mi trochę czasu, zanim się zorientowałem. I zajmuje około 6 linii, aby jawnie załadować plik log4j. Kolejny błąd w Javie, który nigdy nie zostanie naprawiony.
Tuntable
1
Zauważ, że manifestująca się ścieżka-klasy może być używana tylko do ładowania plików jar. Nie można go na przykład użyć do wyszukania pliku log4j3.xml. Mam mnie dobrze.
Tuntable
34

Uruchom plik jar i określ ścieżkę klasy w następujący sposób:

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

jar_name.jar to pełna nazwa pliku JAR, który chcesz wykonać

libs/* to ścieżka do plików JAR zależności

com.test.Appto w pełni kwalifikowana nazwa klasy z pliku JAR zawierającego main(String[])metodę

Jar i zależny jar powinny mieć uprawnienia do wykonywania.

Sid
źródło
10

Możesz to zrobić w powłoce unixowej:

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

Możesz to zrobić w programie Windows PowerShell:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
smoły
źródło
4

Alternatywnie możesz użyć manifestu, aby określić ścieżkę-klasę i klasę główną, jeśli chcesz, więc nie musisz używać -cpani określać klasy głównej. W twoim przypadku zawierałby takie linie:

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

Niestety, musisz przeliterować każdy plik jar w manifeście (nie jest to biggie, jak robisz to tylko raz, i możesz użyć skryptu do zbudowania pliku lub użyć narzędzia do budowania, takiego jak ANT, Maven lub Gradle). Odwołanie musi być katalogiem względnym lub bezwzględnym do miejsca, w którym uruchamiasz plik java -jar MyJar.jar.

Następnie wykonaj to za pomocą

java -jar MyJar.jar
HankCa
źródło
Myślę, że ścieżka klasy musi odnosić się do plików w zewnętrznym słoiku. Ogólnie nie mogłem sprawić, aby to zadziałało, aby odwołać się do plików konfiguracyjnych poza MyJar.jar.
Tuntable
0

Możesz wykonać Runtime.getRuntime.exec (polecenie), aby ponownie uruchomić jar, w tym ścieżkę klas z argumentami.

Tim de Vries
źródło