[JAVA] So ändern Sie den Inhalt der JAR-Datei, ohne sie zu dekomprimieren

Einführung

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.

Fehlerbeispiel

Entpacken und dann mit dem Befehl zip aushärten

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.

Entpacken und neu erstellen mit dem Befehl jar

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).

Erfolgsgeschichte

Ersetzen Sie den Inhalt durch den Befehl zip, ohne ihn zu dekomprimieren

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.

Apropos

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

So ändern Sie den Inhalt der JAR-Datei, ohne sie zu dekomprimieren
[chown] So ändern Sie den Eigentümer einer Datei oder eines Verzeichnisses
JAVA: jar, aar, zeige den Inhalt der Datei an
Passen Sie an, wie der Inhalt von Recyclerview aufgeteilt wird
[Rails] So ändern Sie den Spaltennamen der Tabelle
[Rails] So erhalten Sie den Inhalt starker Parameter
So debuggen Sie die generierte JAR-Datei mit Eclipse
So ändern Sie den Einstellwert von Springboot Hikari CP
[Ruby] So rufen Sie den Inhalt des Doppel-Hash ab
Hinzufügen von Elementen ohne Angabe der Länge des Arrays
[Swift] So ändern Sie dynamisch die Höhe der Symbolleiste auf der Tastatur
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
[Schienen] So ändern Sie den Seitentitel des Browsers für jede Seite
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
So ermitteln Sie die Länge einer Audiodatei mit Java
[Java] Verwendung der File-Klasse
So fügen Sie eine JAR-Datei in ScalaIDE hinzu
So bestimmen Sie die Anzahl der Parallelen
So sortieren Sie eine Liste von SelectItems
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
[swift5] So ändern Sie die Farbe der TabBar oder die Farbe des TabBar-Elements mit Code
So finden Sie die Ursache des Ruby-Fehlers
Ich möchte den Inhalt der Absicht var_dump
Wie komme ich zum heutigen Tag?
Ändern Sie die Zeitzone des https-Portal-Containers in JST
Benennen Sie den Paketnamen einer vorhandenen JAR-Datei um
Ausgabe der Verwendung der Slice-Methode
Doppelklicken Sie, um die JAR-Datei unter Windows zu öffnen
Wie Microservices die Art und Weise der Anwendungsentwicklung verändern
So zeigen Sie das Ergebnis des Ausfüllens des Formulars an
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
[Java] So erhalten Sie die URL der Übergangsquelle
So ändern Sie die Aktion mit mehreren Senden-Schaltflächen
So löschen / aktualisieren Sie das Listenfeld von OneToMany
[Java] So extrahieren Sie den Dateinamen aus dem Pfad
[Ruby on Rails] So ändern Sie den Spaltennamen
Testen Sie den Inhalt einer Excel-Datei mit JUnit
[Java] So erhalten Sie den Maximalwert von HashMap
JavaFX - Geben Sie den Speicherort der CSS-Datei relativ zur fxml-Datei an
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
So beurteilen Sie den Klick eines beliebigen Bildbereichs
Java: Verwenden Sie Stream, um den Inhalt einer Sammlung zu sortieren
So laden Sie eine ältere Version von Apache Tomcat herunter
[Swift] So erhalten Sie die Firebase-Dokument-ID
Wenn Sie SQLite mit VSCode verwenden, verwenden Sie die Erweiterung (wie die Binärdatei von sqlite3 angezeigt wird)
Verwendung von git mit der Leistung von jgit in einer Umgebung ohne git-Befehle