J'ai besoin de lire le fichier manifeste MANIFEST.MF maven à partir de "some.jar" en utilisant bash
Réponses:
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
-q
supprimera la sortie détaillée du programme de décompression-c
va extraire vers stdoutExemple:
$ unzip -q -c commons-lang-2.4.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 1.5.0_13-119 (Apple Inc.)
Package: org.apache.commons.lang
Extension-Name: commons-lang
Specification-Version: 2.4
Specification-Vendor: Apache Software Foundation
Specification-Title: Commons Lang
Implementation-Version: 2.4
Implementation-Vendor: Apache Software Foundation
Implementation-Title: Commons Lang
Implementation-Vendor-Id: org.apache
X-Compile-Source-JDK: 1.3
X-Compile-Target-JDK: 1.2
Vous pouvez également utiliser à la -p
place de -q -c
.
-p extrait les fichiers vers le tube (stdout). Rien d'autre que les données du fichier n'est envoyé à stdout, et les fichiers sont toujours extraits au format binaire, tout comme ils sont stockés (pas de conversions).
utiliser unzip
:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
qui -q
lira tranquillement ( ) le chemin META-INF / MANIFEST.MF depuis le fichier jar (qui est compressé au format zip) vers stdout ( -c
). Vous pouvez ensuite diriger la sortie vers une autre commande pour répondre à des questions telles que `` quelle est la classe principale pour ce fichier jar:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2
(cela supprime toutes les lignes qui ne contiennent pas la chaîne Main-Class
, puis divise la ligne en :
, en ne gardant que le deuxième champ, le nom de la classe). Bien sûr, définissez-le $JARFILE_PATH
correctement ou remplacez-le $JARFILE_PATH
par le chemin vers un fichier jar qui vous intéresse.
En fonction de votre distribution, installez le unzip
package. Puis émettez simplement
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
Cela videra le contenu dans STDOUT.
HTH
D'autres ont publié des articles sur l'utilisation de unzip -p et du piping vers grep ou awk ou tout ce dont vous avez besoin. Bien que cela fonctionne dans la plupart des cas, il convient de noter qu'en raison de la limite de 72 caractères par ligne de MANIFEST.MF, vous pouvez être à la recherche de clés dont les valeurs sont réparties sur plusieurs lignes et seront donc très difficiles à analyser. J'aimerais voir un outil CLI qui peut réellement extraire une valeur rendue du fichier.
http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html
Le script Groovy suivant utilise l'API de Java pour analyser le manifeste, évitant ainsi les problèmes avec les sauts de ligne étranges du format du manifeste:
#!/usr/bin/env groovy
for (arg in args) {
println("[$arg]")
jarPath = new java.io.File(arg).getAbsolutePath()
jarURL = new java.net.URL("jar:file:" + jarPath + "!/")
m = jarURL.openConnection().getManifest()
m.getMainAttributes().each { k, v -> println("$k = $v") }
}
Transmettez les fichiers JAR comme arguments:
$ groovy manifest.groovy ~/.m2/repository/junit/junit/4.13/junit-4.13.jar
[/Users/curtis/.m2/repository/junit/junit/4.13/junit-4.13.jar]
Implementation-Title = JUnit
Automatic-Module-Name = junit
Implementation-Version = 4.13
Archiver-Version = Plexus Archiver
Built-By = marc
Implementation-Vendor-Id = junit
Build-Jdk = 1.6.0_65
Created-By = Apache Maven 3.1.1
Implementation-URL = http://junit.org
Manifest-Version = 1.0
Implementation-Vendor = JUnit
Ou si vous êtes désespéré pour un one-liner:
groovy -e 'new java.net.URL("jar:file:" + new java.io.File(args[0]).getAbsolutePath() + "!/").openConnection().getManifest().getMainAttributes().each { k, v -> println("$k = $v") }' ~/.m2/repository/junit/junit/4.13/junit-4.13.jar