web-dev-qa-db-de.com

Beschädigte JAR-Datei

Ich habe eine JAR-Datei in Windows 7 mit Eclipse erstellt. Wenn ich versuche, die JAR-Datei zu öffnen, wird eine ungültige oder beschädigte JAR-Datei angezeigt. Kann mir jemand vorschlagen, warum die JAR-Datei ungültig ist?

28
Neel

Dies geschieht, wenn Sie in Windows Explorer auf eine JAR-Datei doppelklicken, die JAR-Datei ist jedoch an sich keine ausführbare JAR-Datei. Eine echte ausführbare JAR sollte mindestens eine Klasse mit einer main()-Methode haben und in MANIFEST.MF referenziert werden.

In Eclispe müssen Sie das Projekt als Runnable JAR-Datei und nicht als JAR-Datei exportieren, um eine echte ausführbare JAR-Datei zu erhalten.

Wenn es sich bei Ihrem JAR lediglich um einen Container mit einer Reihe eng zusammengehöriger Klassen (einer Bibliothek) handelt, sollten Sie ihn nicht doppelt anklicken, sondern mit einem Zip-Tool öffnen. Windows Explorer ordnet JAR-Dateien standardmäßig Java.exe zu, was für diese Art von Bibliotheks-JARs nicht geeignet ist.

38
BalusC

Dies tritt regelmäßig auf, wenn Sie die Erweiterung für JAR für Zip ändern, den Zip-Inhalt extrahieren und einige Änderungen an Dateien vornehmen, wie beispielsweise das Ändern der MANIFEST.MF-Datei. Dies ist ein sehr häufiger Fall. Oft generiert Eclipse die MANIFEST-Datei nicht als wir wollen oder vielleicht möchten wir den CLASS-PATH oder die MAIN-CLASS-Werte davon ändern. 

Das Problem tritt auf, wenn Sie den Ordner zurückzippen.

Eine gültige ausführbare/ausführbare JAR hat die nächste Struktur:

myJAR (Main-Directory)
    |-META-INF (Mandatory)
             |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
    |-com 
         |-MainClass.class (must to implement the main method, mandatory)
    |-properties files (optional)
    |-etc (optional)

Wenn Ihre JAR-Regeln diese Regeln einhalten, wird es keine Rolle spielen, wenn Sie es manuell mit einem Zip-Tool erstellen und dann die Erweiterung wieder in .jar ändern

Sobald Sie fertig sind, führen Sie es in der Befehlszeile aus:

Java -jar myJAR.jar 

Wenn Sie ein Zip-Tool zum Entpacken, Ändern von Dateien und erneutem Zip verwenden, ändert sich normalerweise die JAR-Struktur in diese Struktur, die nicht korrekt ist, da oben im Dateisystem eine weitere Verzeichnisebene hinzugefügt wird, die sie zu einer beschädigten Datei macht (siehe unten):

**myJAR (Main-Directory)
    |-myJAR (creates another directory making the file corrupted)**
          |-META-INF (Mandatory)
                   |-MANIFEST.MF (Mandatory Main-class: com.MainClass)
          |-com 
              |-MainClass.class (must to implement the main method, mandatory)
          |-properties files (optional)
          |-etc (optional)

:)

17
Israelm

Das Problem könnte sein, dass sich in Ihrem JAR mehr als 65536 Dateien befinden: Warum beschwert sich Java über JAR-Dateien mit vielen Einträgen? Der Fix wird in dieser Frage Antwort beschrieben.

10
thSoft

Möglicherweise liegt ein Problem mit MANIFEST.MF vor. Starten Sie die Hauptklasse mit folgendem Befehl, wenn Sie das Paket kennen, in dem sich die Hauptklasse befindet.

Java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server
9
prayagupd

Dies ist das häufigste Problem mit "Manifest" im Fehler? Ja, es passiert viel, hier ist ein Link: http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html

Lösung:

Wenn Sie die Manifest-Datei verwenden, um die Manifest-Datei on-the-fly zu erstellen, erhalten Sie folgende Eingabe:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_07-b05 (Sun Microsystems Inc.)
Main-Class: com.example.MyMainClass

Wenn Sie die Manifestdatei selbst erstellen, wird das Problem mit dem Nötigsten behoben:

Manifest-Version: 1.0
Main-Class: com.example.MyMainClass

Nach eingehenderer Untersuchung bin ich mir sicher, dass ich die dynamische Metadatei-Erstellung mit Ant in Verbindung bringen konnte, wie andere Leute es tun. Die Kombination meiner Ant-Version (1.6.2), Java-Version (1.4. 2_07) und vielleicht die aktuelle Mondphase.

Anmerkungen:

Das Parsen der Meta-inf-Datei war ein Problem, das behoben wurde und für Sun erneut angezeigt wurde. Siehe: Fehler-ID: 4991229 . Wenn Sie herausfinden können, ob dieser Fehler in Ihrer (oder meiner) Version der Java SE vorhanden ist, haben Sie mehr Geduld als ich. 

3
Coffee

Es kann auch ein Tippfehler im MANIFEST.MF sein, p.ex. Build-Date mit zwei :

  Build-Date:: 2017-03-13 16:07:12
0

Verwenden Sie den Befehl jar -xvf fileName.jar und exportieren Sie dann den Inhalt der dekomprimierten Datei in ein neues Java-Projekt in Eclipse. 

0
mcginn

Vielleicht war dies nur ein Zufall, aber als ich einmal diesen Fehler hatte, musste ich einfach alle javaw.exe-Prozesse beenden, die im Hintergrund liefen. Die ausführbare JAR funktionierte danach.

0
Nick Green

Stellen Sie außerdem sicher, dass die zur Laufzeit verwendete Java-Version eine äquivalente oder höhere Version als die beim Kompilieren verwendete Java ist

0
Mr. Whoa

Wenn die JAR-Datei am Ende zusätzliche Bytes enthält, können sie von Explorern wie 7-Zip geöffnet werden. Sie werden jedoch als beschädigt betrachtet. Ich verwende ein Online-Upload-System, das automatisch ein zusätzliches Zeichen LF ('\ n', 0x0a) am Ende jeder JAR-Datei hinzufügt. Bei solchen Dateien gibt es verschiedene Lösungen, um die Datei auszuführen:

  • Verwenden Sie den Ansatz von prayagubd und geben Sie die .jar als Klassenpfad und Namen der Hauptklasse am Befehl Prompt an
  • Entfernen Sie das zusätzliche Byte am Ende der Datei (mit einem Hex-Editor oder einem Befehl wie head -c -1 myjar.jar), und führen Sie dann die JAR-Datei durch Doppelklicken oder mit Java -jar myfile.jar wie üblich aus. 
  • Ändern Sie die Erweiterung von .jar in .Zip, extrahieren Sie die Dateien und erstellen Sie die ZIP-Datei erneut. Stellen Sie dabei sicher, dass sich der Ordner META-INF in der obersten Ebene befindet.
  • Ändern Sie die Erweiterung .jar in .Zip, löschen Sie eine nicht benötigte Datei aus der .jar-Datei und ändern Sie die Erweiterung wieder in .jar

Alle diese Lösungen setzen voraus, dass die Struktur der ZIP-Datei und der META-INF-Datei im Wesentlichen korrekt ist. Sie wurden nur mit einem einzigen Byte am Ende der Zip getestet, um sie zu "beschädigen".

Ich habe mich in ein echtes Durcheinander gebracht, indem ich head -c -1 *.jar > tmp.jar zweimal angewendet habe. head hat am Anfang der Datei den ASCII - Text ==> myjar.jar <== eingefügt, wodurch er vollständig beschädigt wurde. 

0
Josiah Yoder