1312 Stimmen

Kann JAR-Datei nicht ausführen: "kein Hauptmanifestattribut"

Ich habe eine Anwendung installiert, wenn ich versuche, sie auszuführen (es handelt sich um ein ausführbares Jar), passiert nichts. Wenn ich es von der Befehlszeile ausführe mit:

java -jar "app.jar"

Ich bekomme die folgende Meldung:

kein Hauptmanifestattribut in "app.jar"

Normalerweise, wenn ich das Programm selbst erstellt hätte, hätte ich ein Hauptklassenattribut zur Manifestdatei hinzugefügt. Aber in diesem Fall, da die Datei von einer Anwendung stammt, kann ich das nicht tun. Ich habe auch versucht, das Jar zu extrahieren, um zu sehen, ob ich die Hauptklasse finden könnte, aber es gibt zu viele Klassen und keine von ihnen hat das Wort "main" in ihrem Namen. Es muss einen Weg geben, das zu beheben, denn das Programm läuft einwandfrei auf anderen Systemen.

3voto

mwag Punkte 2818

Die obigen Antworten waren nur teilweise hilfreich für mich. java -cp war Teil der Antwort, aber ich benötigte spezifischere Informationen darüber, wie ich die Klasse identifizieren konnte, die ausgeführt werden sollte. Hier ist, was bei mir funktioniert hat:

Schritt 1: die Klasse finden, die ich ausführen muss

jar tf /pfad/zum/meinjar.jar | more

Die obersten Zeilen des Ergebnisses waren:

META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...

App.class enthielt die Hauptklasse, die ausgeführt werden soll. Ich bin mir nicht zu 100% sicher, ob man immer davon ausgehen kann, dass die Klasse, die man benötigt, die erste ist, aber für mich war es so. Wenn dem nicht so ist, könnte man sich vorstellen, dass es nicht allzu schwierig ist, mit grep Bibliotheksbezogene Ergebnisse auszuschließen, um die Klassenliste auf eine überschaubare Größe zu reduzieren.

Von dort aus war es einfach: Ich habe einfach diesen Pfad verwendet (ohne das ".class"-Suffix):

java -cp /pfad/zum/meinjar.jar somepath/App

3voto

MichaelT Punkte 61

(erster Beitrag - also kann nicht sauber sein)

Dies ist meine Lösung für OS X 11.6, Maven-basiertes Netbeans 8.2 Programm. Bisher ist meine App zu 100 % Netbeans - ohne Anpassungen (nur ein paar Shell-Escapes für das Unmögliche!).

Nachdem ich die meisten Antworten hier und anderswo erfolglos ausprobiert hatte, kehrte ich zur Kunst des "Nutzens dessen, was funktioniert" zurück.

Die Top-Antwort hier (olivier-refalo danke) schien der richtige Ausgangspunkt zu sein, half aber nicht.

Als ich mir andere Projekte anschaute, die funktionierten, bemerkte ich einige kleine Unterschiede in den Manifest-Zeilen:

  1. addClasspath, classpathPrefix waren abwesend (ich habe sie gelöscht)
  2. mainClass hatte das "com." vermisst (ich habe den NB -> Projekt Eigenschaften->Ausführen->Hauptklasse->Durchsuchen verwendet, um zu spezifizieren)

Nicht sicher warum (ich bin erst seit 3 Monaten bei Java) oder wie, aber ich kann nur sagen, dass das funktioniert hat.

Hier ist nur der modifizierte Manifest-Block, der verwendet wurde:

        mypackage.MyClass

3voto

Neeraj Bhatnagar Punkte 331

Für mich ist dieser Fehler einfach aufgetreten, weil ich vergessen habe, Eclipse mitzuteilen, dass ich eine ausführbare JAR-Datei und nicht eine einfache Bibliotheks-JAR-Datei haben wollte. Also stellen Sie sicher, dass Sie in Eclipse das richtige Optionsfeld anklicken, wenn Sie die JAR-Datei erstellen.

3voto

Die meisten Lösungen haben bei mir nicht funktioniert, aber mein Lehrer hat mir geholfen. ich möchte seine Lösung hier teilen Ich habe das Kali Linux-Terminal verwendet, aber es sollte in allen Debian-Versionen funktionieren

javac *.java
nano MANIFEST.MF

Geben Sie im Dateityp ein

Main-Klasse: Main oder was auch immer der Name Ihrer Hauptdatei ist (stellen Sie sicher, dass Sie den Paketnamen hinzufügen, falls vorhanden)

jar -cvmf MANIFEST.MF new.jar *.class

Jetzt können Sie die Datei mit folgendem Befehl ausführen

java -jar new.jar

oder Sie können zu den Eigenschaften der Datei gehen und überprüfen

Ausführung der Datei erlauben

Doppelklick darauf

Es hat mir geholfen, während die meisten der oben genannten Antworten nicht funktionierten

2voto

Reihan_amn Punkte 2465

Nur um einen Punkt klar zu machen über

Main-Class: .

Wenn du kein Paket hast, musst du diesen Teil ignorieren, so:

Main-Class:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X