In meiner Java-Projektarbeit habe ich den Quellcode als JAR-Datei erstellt und auf dem Server bereitgestellt. Als ich den Inhalt der bereitgestellten JAR-Datei zum Testen neu schreiben wollte, blieb ich ein wenig hängen, daher werde ich die Lösung hier aufschreiben.
In diesem Artikel verwenden wir das Spring-Framework-Projekt als Beispiel. Das Verzeichnis beim Dekomprimieren der JAR-Datei lautet wie folgt.
┣ BOOT-INF/
┣ classes
┗ application.properties <- *Ich möchte diese Datei neu schreiben*
┗ lib
┗ {Glas der Bibliothek, die Sie verwenden}
┣ META-INF/
┣ maven/
┗ {pom.xml}
┗ MANIFEST.MF <-Manifestdatei
┗ org/
┗ {Vollständige Klassendatei}
Insbesondere habe ich versucht, "/ BOOT-INF / classes / application.properties" neu zu schreiben, und es ist fehlgeschlagen.
Die JAR-Datei ist praktisch dieselbe wie die Zip-Datei, daher habe ich die JAR-Datei mit dem Befehl "zip" entpackt, die Datei geändert und erneut versucht, sie mit dem Befehl "zip" neu zu packen.
Als ich versuchte, die App mit dem Befehl java -jar
basierend auf der resultierenden Datei zu starten, wurde der folgende Fehler angezeigt.
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/bcpkix-jdk15on-1.60.jar
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/bcpkix-jdk15on-1.60.jar'
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:256)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:241)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
... 4 more
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/bcpkix-jdk15on-1.60.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:284)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:264)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:252)
... 6 more
Da die Fehlermeldung besagt, dass "verschachtelte JAR-Dateien ohne Komprimierung gespeichert werden müssen", wurden die JAR-Dateien der Bibliotheken unter "BOOT-INF / lib" komprimiert (?) Und nicht als JAR-Dateien gelesen. Es scheint, dass.
Wenn der einfache Befehl zip nicht funktioniert, erstellen Sie mit dem Befehl jar eine JAR-Datei.
jar cvfm xxx.jar ./META-INF/MANIFEST.MF ./
Als ich versuchte, es basierend auf der mit dem obigen Befehl erstellten JAR-Datei zu starten, wurde der folgende Fehler angezeigt.
no main manifest attribute, in xxx.jar
Ich habe die Manifestdatei als Option angegeben, aber sie scheint nicht richtig geladen zu werden (die direkte Ursache für dieses Phänomen ist ungelöst).
Durch Umschreiben des Inhalts ohne Dekomprimieren der JAR-Datei wurde das obige Problem behoben.
Reproduzieren Sie zunächst die Datei, die Sie neu schreiben möchten, und das Verzeichnis, in dem sie sich an Ihrem lokalen Speicherort befindet. Ich wollte dieses Mal die Datei "BOOT-INF / classes / application.properties" neu schreiben, also werde ich sie erstellen.
mkdir -p BOOT-INF/classes && touch ./BOOT-INF/classes/application.properties
Fügen Sie diese lokale Datei "application.properties" nach dem Umschreiben in die Zip-Datei ein.
Bringen Sie die Zip-Datei (xxx.jar
), die Sie importieren möchten, in dasselbe Verzeichnis und importieren Sie sie mit dem folgenden Befehl.
zip ./xxx.jar ./BOOT-INF/classes/MANIFEST.MF
Die resultierende JAR-Datei konnte problemlos funktionieren, wahrscheinlich weil sie nie entpackt wurde.
Im Folgenden wird beschrieben, wie Sie den Inhalt der JAR-Datei neu schreiben. Wenn Sie es nur sehen möchten, anstatt den Inhalt neu zu schreiben, können Sie es mit dem folgenden Befehl sehen.
jar tf xxx.jar
Mein Chef wurde wütend, als ich die JAR-Datei entpackte, um den Inhalt zu überprüfen.
Recommended Posts