Mein Java-Programm ist in einer JAR-Datei verpackt und verwendet eine externe JAR-Bibliothek, eine Hüpfburg . Mein Code wird gut kompiliert, aber das Ausführen des JAR führt zu folgendem Fehler:
Ausnahme im Thread "main" java.lang.SecurityException: Ungültiger Digest der Signaturdatei für Manifest-Hauptattribute
Ich habe über eine Stunde lang gegoogelt und nach einer Erklärung gesucht und sehr wenig Wert gefunden. Wenn jemand diesen Fehler schon einmal gesehen hat und Hilfe anbieten könnte, wäre ich verpflichtet.
Antworten:
Die hier aufgeführte Lösung bietet möglicherweise einen Zeiger.
Endeffekt :
quelle
Für diejenigen, die diesen Fehler beim Erstellen eines Uber-JAR mit erhalten haben
maven-shade-plugin
, besteht die Lösung darin, Manifest-Signaturdateien auszuschließen, indem der Plugin-Konfiguration die folgenden Zeilen hinzugefügt werden:quelle
Für diejenigen, die gradle verwenden und versuchen, ein Fettglas zu erstellen und zu verwenden, kann die folgende Syntax hilfreich sein.
quelle
exclude
meinerfatJar
Aufgabe stellen, die diesenconfigurations.compile.collect
Befehl hatte. Siehe stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Einige Ihrer Abhängigkeiten sind wahrscheinlich signierte Jarfiles. Wenn Sie sie alle zu einer großen Jarfile kombinieren, sind die entsprechenden Signaturdateien immer noch vorhanden und stimmen nicht mehr mit der "großen kombinierten" Jarfile überein, sodass die Laufzeit anhält und denkt, dass die JAR-Datei manipuliert wurde (was sie ... muss) sprechen).
Sie können das Problem lösen, indem Sie die Signaturdateien aus Ihren Jarfile-Abhängigkeiten entfernen. Leider ist es nicht möglich, dies in einem Schritt in ant zu tun .
Ich konnte dies jedoch in zwei Schritten mit Ant zum Laufen bringen, ohne jede Jarfile-Abhängigkeit speziell zu benennen, indem ich Folgendes verwendete:
Das Schlafelement soll in Zukunft Fehler bei Dateien mit Änderungsdaten verhindern .
Andere Variationen, die ich in den verknüpften Threads gefunden habe, haben bei mir nicht funktioniert.
quelle
Bitte benutzen Sie den folgenden Befehl
quelle
Ich hatte dieses Problem bei der Verwendung von IntelliJ IDEA 14.01.
Ich konnte es beheben durch:
Datei-> Projektstruktur-> Neue hinzufügen (Artefakte) -> jar-> Von Modulen mit Abhängigkeiten vom Fenster Jar aus Modul erstellen:
Wählen Sie Ihre Hauptklasse
JAR-Datei aus Bibliotheken Wählen Sie Kopie in das Ausgabeverzeichnis und verknüpfen Sie sie über das Manifest
quelle
Sicherheit ist bereits ein schwieriges Thema, aber ich bin enttäuscht zu sehen, dass die beliebteste Lösung darin besteht, die Sicherheitssignaturen zu löschen. JCE benötigt diese Signaturen . Maven-Schatten explodiert in der BouncyCastle-JAR-Datei, in der die Signaturen in META-INF abgelegt werden. Die BouncyCastle-Signaturen gelten jedoch nicht für ein neues Uber-JAR (nur für das BC-JAR). Dies führt zu dem ungültigen Signaturfehler in diesem Thread .
Ja, das Ausschließen oder Löschen der von @ruhsuzbaykus vorgeschlagenen Signaturen lässt zwar den ursprünglichen Fehler verschwinden, kann aber auch zu neuen, kryptischen Fehlern führen:
Indem Sie explizit angeben, wo sich der Algorithmus wie folgt befindet:
Ich konnte einen anderen Fehler bekommen:
JCE kann den Anbieter nicht authentifizieren, da wir die kryptografischen Signaturen gelöscht haben, indem wir dem Vorschlag an anderer Stelle in demselben Thread gefolgt sind .
Die Lösung, die ich gefunden habe, war das ausführbare Packer- Plugin, das einen JAR-in-JAR-Ansatz verwendet, um die BouncyCastle-Signatur in einem einzelnen ausführbaren JAR beizubehalten.
AKTUALISIEREN :
Eine andere Möglichkeit, dies zu tun (die richtige?), Ist die Verwendung des Maven Jar-Unterzeichners . Auf diese Weise können Sie Maven Shadow weiterhin verwenden, ohne Sicherheitsfehler zu erhalten. Sie müssen jedoch über ein Codesignaturzertifikat verfügen (Oracle schlägt vor, nach "Java Code Signing Certificate" zu suchen). Die POM-Konfiguration sieht folgendermaßen aus:
Nein, es gibt keine Möglichkeit, JCE dazu zu bringen, ein selbstsigniertes Zertifikat zu erkennen. Wenn Sie also die BouncyCastle-Zertifikate aufbewahren müssen, müssen Sie entweder das jar-in-jar-Plugin verwenden oder ein JCE-Zertifikat erwerben.
quelle
Ich hatte das gleiche Problem, nachdem ich irgendwo darauf hingewiesen hatte, dass es wie folgt funktioniert hat:
quelle
maven-shade-plugin
Tag stehen.Angenommen, Sie erstellen Ihre JAR-Datei mit ant, können Sie ant einfach anweisen, das META-INF-Verzeichnis wegzulassen. Dies ist eine vereinfachte Version meines Ameisenziels:
quelle
Ich habe kürzlich begonnen, IntelliJ für meine Projekte zu verwenden. Einige meiner Kollegen verwenden Eclipse jedoch immer noch für dieselben Projekte. Heute habe ich den gleichen Fehler, nachdem ich die von meinem IntelliJ erstellte JAR-Datei ausgeführt habe. Während alle Lösungen hier über fast dasselbe sprachen, funktionierte keine von ihnen problemlos für mich (möglicherweise, weil ich ANT nicht verwende, gab mir maven build andere Fehler, die mich auf http://cwiki.apache.org/ verwiesen). Konfluenz / Anzeige / MAVEN / MojoExecutionException , und ich konnte auch nicht selbst herausfinden, was die signierten Gläser sind!)
Schließlich hat mir das geholfen
Ratet mal, was aus meiner JAR-Datei entfernt wurde?!
Es scheint, dass das Problem für einige Eclipse-relevante Dateien relevant war.
quelle
Ich hatte das gleiche Problem
gradle
beim Erstellen eines fetten Jar. Durch Aktualisieren derbuild.gradle
Datei mit einer Ausschlusszeile wurde das Problem behoben.quelle
Für den Fall, dass Sie gradle verwenden, finden Sie hier eine vollständige farJar-Aufgabe:
quelle
Vergleichen Sie den Ordner META-INF im neuen Glas mit dem alten Glas (bevor Sie neue Bibliotheken hinzugefügt haben). Es ist möglich, dass es neue Dateien gibt. Wenn ja, können Sie sie entfernen. Es sollte helfen. Grüße, 999michal
quelle
Eine Strategie würde darin bestehen, ANT zu verwenden, um das Entfernen der Signatur aus jeder Jar-Datei zu vereinfachen. Es würde mit den folgenden Schritten fortfahren:
Hier ist ein ANT-Makrodef , der die Arbeit erledigt :
`
Die Definition kann dann in einer ANT-Aufgabe folgendermaßen aufgerufen werden:
quelle
Was mir geholfen hat (IntelliJ IDEA 2016.3): Datei -> Projektstruktur -> Artefakte -> JAR hinzufügen -> Hauptklasse auswählen -> Wählen Sie "In das Ausgabeverzeichnis kopieren und über Manifest verknüpfen" -> OK -> Übernehmen -> Erstellen - > Artefakte erstellen ... -> Erstellen
quelle
Es ist möglich, dass zwei verschiedene Unterzeichner den Java-Verstand durcheinander bringen.
Versuchen Sie, den META-INF-Ordner aus dem JAR zu entfernen, das Manifest hinzuzufügen und JAR erneut zu signieren. Dies hat mir geholfen: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- Attribute /
quelle
Wenn Sie nach einer Fat JAR-Lösung suchen, ohne die Originalbibliotheken zu entpacken oder zu manipulieren, aber mit einem speziellen JAR-Klassenladeprogramm, schauen Sie sich mein Projekt hier an .
Haftungsausschluss: Ich habe den Code nicht geschrieben, sondern nur verpackt und auf Maven Central veröffentlicht und in meinem Read-Me beschrieben, wie er verwendet wird.
Ich persönlich verwende es zum Erstellen von ausführbaren JARs, die BouncyCastle-Abhängigkeiten enthalten. Vielleicht ist es auch für Sie nützlich.
quelle
Für diejenigen, die Probleme mit der akzeptierten Lösung haben, gibt es eine andere Möglichkeit, Ressourcen mit DontIncludeResourceTransformer aus dem schattierten Glas auszuschließen:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
Ab Shade 3.0 akzeptiert dieser Transformator eine Liste von Ressourcen. Vorher müssen Sie nur mehrere Transformatoren mit jeweils einer Ressource verwenden.
quelle
Dies ist mir in Intellij passiert, als ich unter dem Strich auf "Als Maven-Projekt hinzufügen" geklickt habe, als Intellij "Nicht verwaltete POM-Dateien gefunden" sagte. Inzwischen wurde bereits ein Ordner generiert. Es wurden also keine Änderungen vorgenommen.
Das Löschen des Ordners und das Ausführen des Programms lösten das Problem für mich. Der Ordner out wurde dann neu erstellt.
Siehe auch die Antwort von Little Fox. Der Fehler, den ich erhielt, war seinem sehr ähnlich.
quelle
Ich hatte ein ähnliches Problem. Der Grund war, dass ich mit einem JDK mit einer anderen JRE als der Standard-JRE in meiner Windows-Box kompilierte.
Die Verwendung der richtigen java.exe hat mein Problem gelöst.
quelle
Wenn Sie dies erhalten, wenn Sie versuchen, JAR-Dateien für ein Xamarin.Android-Bindungsprojekt wie folgt zu binden:
Öffnen Sie einfach die JAR-Dateien mit Winzip und löschen Sie die Meta-Inf-Verzeichnisse. Wiederaufbau - Arbeit erledigt
quelle