Comment lire le fichier MANIFEST.MF à partir de JAR à l'aide de Bash

92

J'ai besoin de lire le fichier manifeste MANIFEST.MF maven à partir de "some.jar" en utilisant bash

romain
la source
4
Les fichiers jar ne sont que des fichiers zip.
Graham Clark

Réponses:

158
$ 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 stdout

Exemple:

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

Miku
la source
2
Je sais que ce fil est ancien, mais pour qui cela peut concerner: à partir du manuel, l'extraction à l'aide de -p ou -c imprimera la sortie sous forme binaire. Si vous avez besoin d'analyser cette sortie d'une manière ou d'une autre (par exemple dans un tableau associatif), vous devez forcer la représentation textuelle avec l'argument -aa, pour qu'elle soit correcte.
tcigler le
19

utiliser unzip:

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF

qui -qlira 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_PATHcorrectement ou remplacez-le $JARFILE_PATHpar le chemin vers un fichier jar qui vous intéresse.

Pouvoirs de Bobby
la source
4

En fonction de votre distribution, installez le unzippackage. Puis émettez simplement

unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF

Cela videra le contenu dans STDOUT.

HTH

Zsolt Botykai
la source
1

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

Justin Clayton
la source
J'ai ajouté une réponse avec un script Groovy qui utilise l'API de Java pour obtenir et imprimer les paires clé / valeur rendues, ainsi qu'un one-liner convivial bash pour l'invoquer.
ctrueden
1

$ tar xfO some.jar META-INF/MANIFEST.MF

xextrait et Oredirige vers stdout.

Remarque: semble fonctionner uniquement dans bsdtar, pas GNU tar.

rlovtang
la source
0

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
ctrueden
la source