Antworten:
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
-q
unterdrückt die ausführliche Ausgabe des Entpackungsprogramms-c
wird zu stdout extrahierenBeispiel:
$ 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
Alternativ können Sie -p
anstelle von verwenden -q -c
.
-p extrahiert Dateien in Pipe (stdout). Es werden nur die Dateidaten an stdout gesendet, und die Dateien werden immer im Binärformat extrahiert, so wie sie gespeichert sind (keine Konvertierungen).
Verwenden Sie unzip
:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
-q
Dadurch wird leise ( ) der Pfad META-INF / MANIFEST.MF von der Jarfile (die im Zip-Format komprimiert wird) zu stdout ( -c
) gelesen . Sie können die Ausgabe dann an einen anderen Befehl weiterleiten, um Fragen wie "Was ist die Hauptklasse für dieses Glas?" Zu beantworten.
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2
(Dadurch werden alle Zeilen entfernt, die die Zeichenfolge nicht enthalten Main-Class
, und die Zeile wird bei geteilt :
, wobei nur das zweite Feld, der Klassenname, beibehalten wird.) Definieren Sie dies entweder $JARFILE_PATH
entsprechend oder ersetzen Sie es $JARFILE_PATH
durch den Pfad zu einem Jarfile, an dem Sie interessiert sind.
Installieren Sie das unzip
Paket abhängig von Ihrer Distribution . Dann einfach ausstellen
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
Dadurch wird der Inhalt an STDOUT ausgegeben.
HTH
Andere haben über die Verwendung von unzip -p und Piping für grep oder awk oder was auch immer Sie brauchen gepostet. Während dies in den meisten Fällen funktioniert, ist es erwähnenswert, dass Sie aufgrund der Beschränkung von MANIFEST.MF auf 72 Zeichen pro Zeile möglicherweise nach Schlüsseln suchen, deren Werte über mehrere Zeilen verteilt sind und daher sehr schwer zu analysieren sind. Ich würde gerne ein CLI-Tool sehen, das tatsächlich einen gerenderten Wert aus der Datei ziehen kann.
http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html
Das folgende Groovy-Skript verwendet die Java-API, um das Manifest zu analysieren und Probleme mit dem seltsamen Zeilenumbruch des Manifestformats zu vermeiden:
#!/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") }
}
Übergeben Sie JAR-Dateien als Argumente:
$ 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
Oder wenn Sie verzweifelt nach einem Einzeiler suchen:
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