Dlaczego nie udało się załadować atrybutu manifestu klasy głównej z pliku JAR?

85

W ten sposób utworzyłem plik JAR jar cf jar-file input-files. Teraz próbuję go uruchomić. Uruchomienie go nie działa (nie znaleziono polecenia jre):

jre -cp app.jar MainClass

To też nie działa:

java -jar main.jar

(Nie udało się załadować atrybutu manifestu klasy głównej z pliku main.jar).

Ja też się o tym dowiedziałem

Aby uruchomić aplikację spakowaną jako plik JAR (wersja 1.2 - wymaga nagłówka manifestu klasy głównej)

Co to jest „nagłówek manifestu klasy głównej”? Jak go stworzyć i gdzie go umieścić?

rzymski
źródło

Odpowiedzi:

62

Nie jestem pewien, czy wierzę w twoje objawy:

  • Jeśli jrepolecenie nie zostanie znalezione, uruchomienie jre -cp app.jarpowinno spowodować ten sam błąd
  • Samo dodanie pliku JAR do ścieżki klas nie powinno powodować wyświetlanego błędu

Spodziewałbym się, że zobaczysz ten błąd, jeśli uruchomisz:

java -jar app.jar

Nagłówek klasy głównej musi znajdować się w manifeście pliku JAR - są to metadane dotyczące rzeczy takich jak inne wymagane biblioteki. Zobacz dokumentację firmy Sun, aby dowiedzieć się, jak utworzyć odpowiedni manifest. Zasadniczo musisz utworzyć plik tekstowy, który zawiera taki wiersz:

Main-Class: MainClass

Następnie uruchomić

jar cfm app.jar manifest.txt *.class
Jon Skeet
źródło
Dziękuję Ci. To działa. Utworzyłem plik manifestu za pomocą, Main-Class: MainClassa następnie utworzyłem plik .jar za pomocą polecenia, które podałeś. Potem mogłem uruchomić mój program java -jar main.jar.
Roman,
1
Inną opcją jest użycie opcji -e, bez konieczności posiadania oddzielnego pliku. jar cfe app.jar MainClass *.classUwaga: -e zostało dodane w JDK 6.
pferate
35
  1. ustaw ścieżkę klasy i kompiluj

    javac -classpath "C: \ Program Files \ Java \ jdk1.6.0_ updateVersion \ tools.jar" yourApp.java

  2. utwórz manifest.txt

    Klasa główna: nowa linia yourApp

  3. utwórz yourApp.jar

    jar cvf0m yourApp.jar manifest.txt yourApp.class

  4. uruchom yourApp.jar

    java -jar yourApp.jar

weirdFactory
źródło
9

Możesz biegać z:

java -cp .;app.jar package.MainClass

U mnie działa, jeśli w pliku JAR nie ma manifestu.

Dainius
źródło
Mam: Nierozpoznana opcja: -cp. Czy mógłbyś przejrzeć swoją odpowiedź? Ponieważ nie robię tego, co próbuje zrobić to polecenie. (java -cp.; pakiet app.jar.MainClass). To jest jedno polecenie czy dwa?
kenorb
1
docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/… "-cp.; app.jar" powinno dodać plik app.jar do ścieżki klasy, niż można uruchomić metodę MainClass.main () ( MainClass znajduje się w pakiecie „pakiet”).
Dainius,
1
Więc prawdopodobnie w Linuksie ta opcja (-cp) nie istnieje (moja to java v1.6.0_24, OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-1ubuntu0.12.04.1)).
kenorb,
java -version => Java HotSpot (TM) 64-bitowa maszyna wirtualna serwera (kompilacja 20.1-b02, tryb mieszany) „java -cp. test1.Main” działa
Dainius
/ usr / lib / jvm / java-6-openjdk-amd64 / bin / java -version => 64-bitowa maszyna wirtualna serwera OpenJDK (wersja 20.0-b12, tryb mieszany) "/ usr / lib / jvm / java-6-openjdk -amd64 / bin / java -cp. test1.Main "działa
Dainius,
6

Otrzymałem ten błąd, a to dlatego, że miałem argumenty w złej kolejności:

POPRAWNY

java maui.main.Examples tagging -jar maui-1.0.jar 

ŹLE

java -jar maui-1.0.jar maui.main.Examples tagging 
Sridhar Sarnobat
źródło
1
To może być tylko problem bsd, jestem prawie pewien, że ostatnio zrobiłem to w inny sposób.
Sridhar Sarnobat
1

Najłatwiejszym sposobem upewnienia się, że poprawnie utworzyłeś uruchamialny plik JAR, z odpowiednim plikiem manifestu, jest użycie Eclipse do zbudowania go za Ciebie. W swoim projekcie Eclipse po prostu wybierasz z menu Plik / Eksportuj i postępujesz zgodnie z instrukcjami.

W ten sposób możesz być pewien, że plik JAR jest poprawny i będziesz wiedział, aby szukać gdzie indziej, jeśli nadal występuje problem. Proces jest szczegółowo opisany w FAQ Jak utworzyć wykonywalny plik JAR dla samodzielnego programu SWT? .

Greg Burdett
źródło
Dziękuję za ExportEclipse IDE.
Ninh Pham
1

Próbować

java -cp .:mail-1.4.1.jar JavaxMailHTML 

nie ma potrzeby posiadania manifestpliku.

user4581964
źródło
0

Odkryłem, że mam również ten błąd w NetBeans. Mam nadzieję, że poniższe informacje są pomocne.

  1. Upewnij się, że przechodząc do Project Configuration ustawiłeś główną klasę, którą zamierzasz uruchomić.
  2. Wykonaj kompilację lub wyczyść kompilację
  3. Umieść plik jar w wybranym miejscu i spróbuj ponownie: java -jar "YourProject.jar" w wierszu poleceń.

To był problem, który otrzymałem, ponieważ miałem inne programy „testowe”, których używałem w NetBeans i musiałem upewnić się, że klasa główna w części Run konfiguracji projektu jest ustawiona poprawnie.

wiele błogosławieństw, John P.

john p
źródło
0

Otrzymałem ten sam błąd, gdy uruchomiłem:
jar cvfm test.jar Test.class Manifest.txt

Rozwiązaniem było to:
jar cvfm test.jar Manifest.txt Test.class

Mój manifest ma punkt wejścia podany w dokumentach Oracle (upewnij się, że na końcu pliku znajduje się znak nowego wiersza):
Main-Class: Test

Oczywiste dziecko
źródło
0

Miałem ten sam problem. To polecenie uniksowe nie może znaleźć głównej klasy. Dzieje się tak, ponieważ wersje JDK w czasie wykonywania i kompilacji są różne. Po zmianie wersji kompilatora java przejdź przez zaćmienie jar. Poniższy link pomógł mi.

http://crunchify.com/exception-in-thread-main-java-lang-unsupportedclassversionerror-comcrunchifymain-unsupported-major-minor-version-51-0/

Spróbuj uruchomić jar utworzony po tym kroku, a następnie wykonaj go

Harshita Sethi
źródło
0

Jeśli ścieżka do klasy jest w pełni określona w manifeście, być może potrzebujesz ostatniej wersji środowiska wykonawczego java. Mój problem został rozwiązany po ponownym zainstalowaniu JRE 8.

AmirHossein Rezaei
źródło
0

Jeśli używasz eclipse, spróbuj poniżej: 1. Kliknij prawym przyciskiem myszy projekt -> wybierz Eksportuj 2. Wybierz plik Runnable Jar w miejscu docelowym eksportu 3. Wprowadź nazwę słoika i wybierz opcję „Wymagany pakiet ...” (drugi przycisk opcji) -> Zakończ

Mam nadzieję że to pomoże...!

Barani r
źródło