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.

6voto

CodeMonkey Punkte 3308

Ich hatte das gleiche Problem. Viele der hier genannten Lösungen haben mir kein vollständiges Bild gegeben, also werde ich versuchen, Ihnen eine Zusammenfassung davon zu geben, wie Sie Jar-Dateien von der Befehlszeile aus packen.

  1. Wenn Sie Ihre .class-Dateien in Paketen haben möchten, fügen Sie das Paket am Anfang der .java hinzu.

    Test.java

    package testpackage;
    
    public class Test
    {
        ...
    }
  2. Um Ihren Code mit Ihren .class-Dateien zu kompilieren, die mit der Struktur enden, die durch den Paketnamen angegeben ist, verwenden Sie:

    javac -d . Test.java

    Das -d . bewirkt, dass der Compiler die gewünschte Verzeichnisstruktur erstellt.

  3. Beim Verpacken der .jar-Datei müssen Sie dem jar-Routine anweisen, wie sie verpackt werden soll. Hier verwenden wir die Option cvfeP. Dies dient dazu, die Paketstruktur beizubehalten (Option P), den Einstiegspunkt anzugeben, sodass die Manifestdatei sinnvolle Informationen enthält (Option e). Option f ermöglicht es Ihnen, den Dateinamen anzugeben, Option c erstellt ein Archiv und Option v setzt die Ausgabe auf verbose. Die wichtigen Punkte hier sind P und e.

    Dann kommt der Name des Jars, den wir wollen test.jar.

    Dann kommt der Einstiegspunkt.

    Und dann kommt -C . /, um die Klassendateien aus diesem Ordner zu holen und die Ordnerstruktur beizubehalten.

    jar cvfeP test.jar testpackage.Test -C . testpackage/
  4. Überprüfen Sie Ihre .jar-Datei in einem Zip-Programm. Sie sollte die folgende Struktur haben

    test.jar

    META-INF
    | MANIFEST.MF
    testpackage
    | Test.class

    Die MANIFEST.MF sollte das Folgende enthalten

    Manifest-Version: 1.0
    Created-By:  (Oracle Corporation)
    Main-Class: testpackage.Test

    Wenn Sie Ihr Manifest von Hand bearbeiten, stellen Sie sicher, dass am Ende eine Newline vorhanden ist, da Java es sonst nicht erkennt.

  5. Führen Sie Ihre .jar-Datei aus mit

    java -jar test.jar

6voto

djangofan Punkte 26852

Ich persönlich denke, dass alle Antworten hier die Frage missverstehen. Die Antwort darauf liegt in dem Unterschied, wie spring-boot die .jar erstellt. Jeder weiß, dass Spring Boot ein Manifest wie dieses einrichtet, das sich von der Annahme der meisten Leute unterscheidet, dass es sich um einen standardmäßigen .jar-Start handelt, was jedoch nicht der Fall sein muss:

Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher

Vielleicht muss es mit org.springframework.boot.loader.JarLauncher auf dem Klassenpfad ausgeführt werden?

6voto

Dave Beauchesne Punkte 111

Ich habe eine neue Lösung für die schlechte Manifestgenerierung gefunden!

  1. Öffnen Sie die Jar-Datei mit einem Zip-Editor wie WinRAR

  2. Klicke für META-INF

  3. Hinzufügen oder bearbeiten

    • Hinzufügen:

      • Erstellen Sie eine Textdatei mit dem Namen MANIFEST.MF in einem Ordner namens META-INF und fügen Sie die folgende Zeile hinzu:

        • Manifest-Version: 1.0
        • Main-Class: package.ex.com.views.mainClassName
      • Speichern Sie die Datei und fügen Sie sie dem Zip hinzu
    • Bearbeiten:

      • Ziehen Sie die Datei heraus und ändern Sie die MANIFEST.MF, um die vorherige Zeile hinzuzufügen
  4. Öffnen Sie cmd und geben Sie ein: java -jar c:/Pfad/JarName.jar

Es sollte jetzt funktionieren!

6voto

Andrew Punkte 33981

Wenn Sie die Befehlszeile verwenden, um .jar zusammenzubauen, können Sie auf das Hauptziel zeigen, ohne die Manifestdatei hinzuzufügen. Beispiel:

jar cfve app.jar DerNameDerKlasseMitMainMethode *.class

(Parameter "e" bewirkt dies: DerNameDerKlasseMitMainMethode ist der Name der Klasse mit der Methode main() und app.jar ist der Name der ausführbaren .jar-Datei und *.class sind einfach alle Klassen Dateien, die zusammengebaut werden sollen)

5voto

KarthikPon Punkte 149

Ich hatte das gleiche Problem und jetzt ist es behoben:) Befolgen Sie einfach die folgenden Schritte. Der Fehler könnte bei allem liegen, aber die untenstehenden Schritte erleichtern den Prozess. Ich habe viel Zeit damit verbracht, die Lösung zu finden.

1. Versuchen Sie, Eclipse neu zu starten (wenn Sie Eclipse zum Erstellen der JAR-Datei verwenden) --> Tatsächlich hat mir dies geholfen, das Problem beim Exportieren der JAR-Datei ordnungsgemäß zu lösen.

2. Nach dem Neustart von Eclipse sehen Sie nach, ob Eclipse in der Lage ist, die Hauptklasse/den Hauptmethode Ihres Java-Projekts zu erkennen --> Rechtsklick --> Ausführen als --> Ausführungskonfigurationen --> Haupt --> Klicken Sie auf die Schaltfläche "Suchen", um zu überprüfen, ob Eclipse Ihre Hauptklasse in der JAR-Datei finden kann. --> Dies dient der Validierung, dass die JAR-Datei den Einstiegspunkt zur Hauptklasse hat.

  1. Nach diesem Schritt exportieren Sie Ihr Java Dynamic-Projekt als "Ausführbare JAR"-Datei und nicht als JAR-Datei.

  2. In der Java-Startkonfiguration wählen Sie Ihre Hauptklasse aus.

  3. Nach dem Exportieren der JAR-Datei verwenden Sie den unten stehenden Befehl zum Ausführen. java -cp [Ihre JAR].jar [komplettes Paket].MainClass Beispiel: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit

  4. Möglicherweise erhalten Sie einen Fehler aufgrund einer nicht unterstützten Java-Version. Die Lösung besteht darin, die java_home in Ihrem Shell-Bash-Profil so anzupassen, dass sie mit der in Eclipse verwendeten Java-Version übereinstimmt, mit der das Projekt kompiliert wurde.

Ich hoffe, das hilft! Lassen Sie mich bitte wissen, wenn Sie immer noch Probleme haben.

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