Dans mon travail de projet Java, j'ai construit le code source sous forme de fichier jar et je l'ai déployé sur le serveur. Lorsque je voulais réécrire le contenu du fichier jar déployé pour le test, je me suis un peu bloqué, donc je vais écrire la solution ici.
Dans cet article, nous utiliserons le projet de framework Spring comme exemple. Le répertoire lors de la décompression du fichier jar est le suivant.
┣ BOOT-INF/
┣ classes
┗ application.properties <- *Je veux réécrire ce fichier*
┗ lib
┗ {Pot de la bibliothèque que vous utilisez}
┣ META-INF/
┣ maven/
┗ {pom.xml}
┗ MANIFEST.MF <-Fichier manifeste
┗ org/
┗ {Dossier de classe complet}
Plus précisément, j'ai essayé de réécrire / BOOT-INF / classes / application.properties
et cela a échoué.
Le fichier jar est pratiquement le même que le fichier zip, j'ai donc décompressé le fichier jar avec la commande zip
, modifié le fichier et essayé de le reconditionner avec la commande zip
.
Lorsque j'ai essayé de démarrer l'application avec la commande java -jar
basée sur le fichier résultant, j'ai eu l'erreur suivante.
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
Comme le message d'erreur dit «les fichiers jar imbriqués doivent être stockés sans compression», les fichiers jar des bibliothèques sous «BOOT-INF / lib» ont été compressés (?) Et ils n'ont pas été lus comme des fichiers jar. Il semble.
Si la simple commande zip ne fonctionne pas, essayez de créer un fichier jar avec la commande jar.
jar cvfm xxx.jar ./META-INF/MANIFEST.MF ./
Lorsque j'ai essayé de le démarrer en fonction du fichier jar créé par la commande ci-dessus, j'ai eu l'erreur suivante.
no main manifest attribute, in xxx.jar
J'ai spécifié le fichier manifeste comme option, mais il ne semble pas se charger correctement (la cause directe de ce phénomène n'est pas résolue).
En réécrivant le contenu sans décompresser le fichier jar, le problème ci-dessus a été résolu.
Tout d'abord, reproduisez le fichier que vous souhaitez réécrire et le répertoire où il se trouve dans votre emplacement local.
Je voulais réécrire le fichier BOOT-INF / classes / application.properties
cette fois, donc je vais le créer.
mkdir -p BOOT-INF/classes && touch ./BOOT-INF/classes/application.properties
Après avoir réécrit ce fichier local ʻapplication.properties, incluez-le dans le zip. Apportez le fichier zip (
xxx.jar`) que vous souhaitez importer dans le même répertoire et importez-le avec la commande suivante.
zip ./xxx.jar ./BOOT-INF/classes/MANIFEST.MF
Le fichier jar résultant a pu fonctionner sans aucun problème, probablement parce qu'il n'avait jamais été décompressé.
Voici comment réécrire le contenu du fichier jar. Si vous voulez simplement le voir au lieu de réécrire le contenu, vous pouvez le voir avec la commande suivante.
jar tf xxx.jar
Mon patron s'est mis en colère lorsque je décompressais le fichier jar pour en vérifier le contenu.
Recommended Posts