Warum konnte das Manifestattribut der Hauptklasse nicht aus einer JAR-Datei geladen werden?

85

Ich habe auf diese Weise eine JAR-Datei erstellt jar cf jar-file input-files. Jetzt versuche ich es auszuführen. Das Ausführen funktioniert nicht (Befehl jre wurde nicht gefunden):

jre -cp app.jar MainClass

Dies funktioniert auch nicht:

java -jar main.jar

(Fehler beim Laden des Manifestattributs der Hauptklasse aus main.jar).

Das habe ich auch herausgefunden

Um eine als JAR-Datei gepackte Anwendung auszuführen (Version 1.2 - erfordert den Manifest-Header der Hauptklasse)

Was ist der "Manifest-Header der Hauptklasse"? Wie erstelle ich es und wo lege ich es ab?

römisch
quelle

Antworten:

62

Ich bin nicht sicher, ob ich Ihren Symptomen glaube:

  • Wenn der jreBefehl nicht gefunden wird, jre -cp app.jarsollte das Ausführen denselben Fehler ergeben
  • Das Hinzufügen einer JAR- Datei zum Klassenpfad sollte nicht den angezeigten Fehler ergeben

Ich würde erwarten, dass Sie diesen Fehler sehen, wenn Sie ausführen:

java -jar app.jar

Der Header der Hauptklasse muss sich im Manifest für die JAR-Datei befinden - dies sind Metadaten zu Dingen wie anderen erforderlichen Bibliotheken. Informationen zum Erstellen eines geeigneten Manifests finden Sie in der Sun-Dokumentation . Grundsätzlich müssen Sie eine Textdatei erstellen, die eine Zeile wie die folgende enthält:

Main-Class: MainClass

Dann renne

jar cfm app.jar manifest.txt *.class
Jon Skeet
quelle
Danke dir. Es klappt. Ich habe eine Manifestdatei mit dem erstellt Main-Class: MainClassund dann die JAR-Datei mit dem von Ihnen angegebenen Befehl erstellt. Danach konnte ich mein Programm durchlaufen java -jar main.jar.
Roman
1
Eine andere Option ist die Verwendung der Option -e, ohne dass eine separate Datei erforderlich ist. jar cfe app.jar MainClass *.classHinweis: -e wurde in JDK 6 hinzugefügt.
Siehe
35
  1. Legen Sie den Klassenpfad fest und kompilieren Sie

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

  2. create manifest.txt

    Hauptklasse: yourApp newline

  3. Erstellen Sie Ihre App.jar

    jar cvf0m yourApp.jar manifest.txt yourApp.class

  4. Führen Sie yourApp.jar aus

    java -jar yourApp.jar

seltsamFactory
quelle
9

Sie können laufen mit:

java -cp .;app.jar package.MainClass

Es funktioniert für mich, wenn die JAR-Datei kein Manifest enthält.

Dainius
quelle
Ich habe: Nicht erkannte Option: -cp. Könnten Sie Ihre Antwort überprüfen? Weil ich nicht weiß, was dieser Befehl versucht. (java -cp .; app.jar package.MainClass). Dies ist ein Befehl oder zwei?
Kenorb
1
docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/… "-cp .; app.jar" sollte Ihre app.jar-Datei zum Klassenpfad hinzufügen, damit Sie die MainClass.main () -Methode () ausführen können. MainClass befindet sich im "Paket" -Paket.
Dainius
1
Unter Linux existiert diese Option (-cp) wahrscheinlich nicht (meine ist 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-Bit-Server-VM (Build 20.1-b02, gemischter Modus) "java -cp. test1.Main" funktioniert
Dainius
/ usr / lib / jvm / java-6-openjdk-amd64 / bin / java -version => 64-Bit-Server-VM von OpenJDK (Build 20.0-b12, gemischter Modus) "/ usr / lib / jvm / java-6-openjdk -amd64 / bin / java -cp. test1.Main "funktioniert
Dainius
6

Ich habe diesen Fehler erhalten, weil ich die Argumente in der falschen Reihenfolge hatte:

RICHTIG

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

FALSCH

java -jar maui-1.0.jar maui.main.Examples tagging 
Sridhar Sarnobat
quelle
Dies ist möglicherweise nur ein BSD-Problem. Ich bin mir ziemlich sicher, dass ich es in letzter Zeit anders gemacht habe.
Sridhar Sarnobat
1

Der einfachste Weg, um sicherzustellen, dass Sie die ausführbare JAR-Datei mit der entsprechenden Manifestdatei korrekt erstellt haben, besteht darin, sie mit Eclipse für Sie zu erstellen. In Ihrem Eclipse-Projekt wählen Sie einfach Datei / Exportieren aus dem Menü und folgen den Anweisungen.

Auf diese Weise können Sie sicher sein, dass Ihre JAR-Datei korrekt ist und wissen, wo Sie suchen müssen, wenn immer noch ein Problem vorliegt. Der Vorgang wird ausführlich in den FAQ beschrieben. Wie erstelle ich eine ausführbare JAR-Datei für ein eigenständiges SWT-Programm? .

Greg Burdett
quelle
Vielen Dank für Exportin Eclipse IDE.
Ninh Pham
0

Ich habe festgestellt, dass ich diesen Fehler auch in NetBeans hatte. Ich hoffe das Folgende ist hilfreich.

  1. Stellen Sie sicher, dass Sie in der Projektkonfiguration die Hauptklasse festlegen, die Sie ausführen möchten.
  2. Führen Sie einen Build oder Clean Build durch
  3. Platzieren Sie die JAR-Datei an der gewünschten Stelle und versuchen Sie es erneut: java -jar "YourProject.jar" in der Befehlszeile.

Dies war das Problem, das ich bekam, weil ich andere "Test" -Programme hatte, die ich in NetBeans verwendete, und ich musste sicherstellen, dass die Hauptklasse unter dem Abschnitt "Ausführen" der Projektkonfiguration korrekt eingestellt war.

viele Segnungen, John P.

john p
quelle
0

Beim Ausführen wurde der gleiche Fehler angezeigt :
jar cvfm test.jar Test.class Manifest.txt

Was es löste, war folgendes:
jar cvfm test.jar Manifest.txt Test.class

Mein Manifest hat den in Oracle-Dokumenten angegebenen Einstiegspunkt (stellen Sie sicher, dass am Ende der Datei ein neues Zeilenzeichen steht):
Hauptklasse: Test

Offensichtliches Kind
quelle
0

Versuchen

java -cp .:mail-1.4.1.jar JavaxMailHTML 

Keine manifestDatei erforderlich .

user4581964
quelle
0

Ich hatte das gleiche Problem. Dieser Unix-Befehl kann die Hauptklasse nicht finden. Dies liegt daran, dass die JDK-Versionen zur Laufzeit und zur Kompilierungszeit unterschiedlich sind. Machen Sie das Glas durch Eclipse, nachdem Sie die Java-Compiler-Version geändert haben. Der folgende Link hat mir geholfen.

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

Versuchen Sie, das nach diesem Schritt erstellte Glas auszuführen, und führen Sie es dann aus

Harshita Sethi
quelle
0

Wenn Ihr Klassenpfad im Manifest vollständig angegeben ist, benötigen Sie möglicherweise die letzte Version der Java-Laufzeitumgebung. Mein Problem wurde behoben, als ich das jre 8 neu installierte.

AmirHossein Rezaei
quelle
0

Wenn Sie Eclipse verwenden, versuchen Sie Folgendes: 1. Klicken Sie mit der rechten Maustaste auf das Projekt -> wählen Sie Exportieren. 2. Wählen Sie Runnable Jar-Datei aus, um ein Exportziel auszuwählen. 3. Geben Sie den Namen des Jars ein und wählen Sie "Paket erforderlich ..." (zweites Optionsfeld). -> Fertig stellen

Hoffe das hilft...!

Barani r
quelle