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.

1297voto

Olivier Refalo Punkte 47916

Zuerst ist es irgendwie seltsam, dich java -jar "app" ausführen zu sehen und nicht java -jar app.jar

Zweitens, um ein Jar ausführbar zu machen... musst du eine Datei mit dem Namen META-INF/MANIFEST.MF verpacken

Die Datei selbst sollte (mindestens) diese eine Zeile haben:

Main-Class: com.mypackage.MyClass

Wo com.mypackage.MyClass die Klasse ist, die den public static void main(String[] args) Einstiegspunkt enthält.

Beachte, dass es mehrere Möglichkeiten gibt, um dies zu erledigen, entweder mit der CLI, Maven, Ant oder Gradle:

Für CLI wird der folgende Befehl verwendet: (Danke @dvvrt)

jar cmvf META-INF/MANIFEST.MF .jar  

Für Maven sollte etwas ähnliches wie der folgende Ausschnitt funktionieren. Beachte, dass dies nur die Plugin-Definition ist, nicht das vollständige pom.xml:

Aktuellste Dokumentation zu diesem Plugin: siehe https://maven.apache.org/plugins/maven-jar-plugin/

      org.apache.maven.plugins
      maven-jar-plugin
      3.1.0

            true
            lib/
            com.mypackage.MyClass

(Wähle eine passend zu deinem Projekt.)

Für Ant sollte der folgende Ausschnitt helfen:

Anerkennung Michael Niemand -

Für Gradle:

plugins {
    id 'java'
}

jar {
    manifest {
        attributes(
                'Main-Class': 'com.mypackage.MyClass'
        )
    }
}

366voto

Jesper Punkte 193903

Dies sollte java -jar app.jar anstelle von java -jar "app" sein.

Die Option -jar funktioniert nur, wenn die JAR-Datei eine ausführbare JAR-Datei ist, was bedeutet, dass sie eine Manifestdatei mit einem Main-Class-Attribut enthalten muss. Siehe Programme in JAR-Dateien verpacken, um zu erfahren, wie man eine ausführbare JAR erstellt.

Wenn es sich nicht um eine ausführbare JAR handelt, dann müssen Sie das Programm mit etwas wie folgt ausführen:

java -cp app.jar com.somepackage.SomeClass

wobei com.somepackage.SomeClass die Klasse ist, die die Methode main enthält, um das Programm auszuführen. (Welche Klasse das ist, hängt vom Programm ab, das aus den von Ihnen bereitgestellten Informationen nicht ersichtlich ist).

168voto

CodeBrew Punkte 5815

Alternativ können Sie das maven-assembly-plugin verwenden, wie im folgenden Beispiel gezeigt:

    maven-assembly-plugin

        package

          single

          true
          com.package.MainClass

        jar-with-dependencies

In diesem Beispiel werden alle Abhängigkeits-Jar-Dateien, wie im Bereich angegeben, automatisch in Ihre einzelne Jar-Datei aufgenommen. Beachten Sie, dass jar-with-dependencies wörtlich eingefügt werden sollte, ohne durch die Jar-Dateinamen ersetzt zu werden, die Sie inkludieren möchten.

67voto

Sasanka Panguluri Punkte 3009

Dies liegt daran, dass Java das Hauptattribut in der MANIFEST.MF-Datei nicht finden kann. Das Hauptattribut ist notwendig, um Java mitzuteilen, welche Klasse es als Einstiegspunkt der Anwendung verwenden soll. Innerhalb der Jar-Datei befindet sich die MANIFEST.MF-Datei im META-INF-Ordner. Fragen Sie sich, wie Sie den Inhalt einer Jar-Datei anzeigen können? Öffnen Sie die Jar-Datei mit WinRAR.

Das Hauptattribut innerhalb der MANIFEST.MF sieht so aus:

Main-Class: .

Sie erhalten diesen "kein Haupt-Manifestattribut"-Fehler, wenn diese Zeile in der MANIFEST.MF-Datei fehlt.

Es ist wirklich ein großes Durcheinander, dieses Attribut in der MANIFEST.MF-Datei anzugeben.

Update: Ich habe gerade eine wirklich clevere Möglichkeit gefunden, den Anwendungseinstiegspunkt in Eclipse anzugeben. Wenn Sie Export sagen,

Wählen Sie Jar und weiter

[Geben Sie im nächsten Fenster einen Namen ein] und weiter

und nochmal weiter

und Sie werden "Wählen Sie die Klasse des Anwendungseinstiegspunkts" sehen.

Wählen Sie einfach eine Klasse aus und Eclipse wird automatisch eine coole MANIFEST.MF für Sie erstellen.

Bildbeschreibung hier eingeben

54voto

Ich hatte das gleiche Problem. Indem ich die folgenden Zeilen zur POM-Datei hinzugefügt habe, habe ich es zum Laufen gebracht. Das Plugin wird sicherstellen, dass der Build-Prozess Ihrer Anwendung mit allen notwendigen Schritten durchgeführt wird.

            org.springframework.boot
            spring-boot-maven-plugin

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