Lesen der MANIFEST.MF-Datei aus JAR mit Bash

92

Ich muss die MANIFEST.MF-Maven-Manifestdatei aus "some.jar" mit bash lesen

römisch
quelle
4
JAR-Dateien sind nur Zip-Dateien.
Graham Clark

Antworten:

157
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q unterdrückt die ausführliche Ausgabe des Entpackungsprogramms
  • -c wird zu stdout extrahieren

Beispiel:

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

miku
quelle
2
Ich weiß, dass dieser Thread alt ist, aber für wen es wichtig sein könnte: Wie aus dem Handbuch wird beim Extrahieren mit -p oder -c die Ausgabe in binärer Form gedruckt. Wenn Sie diese Ausgabe irgendwie analysieren müssen (z. B. in ein assoziatives Array), sollten Sie die Textdarstellung mit dem Argument -aa erzwingen, damit sie korrekt ist.
Tcigler
19

Verwenden Sie unzip:

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

-qDadurch 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_PATHentsprechend oder ersetzen Sie es $JARFILE_PATHdurch den Pfad zu einem Jarfile, an dem Sie interessiert sind.

Bobby Powers
quelle
4

Installieren Sie das unzipPaket 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

Zsolt Botykai
quelle
1

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

Justin Clayton
quelle
Ich habe eine Antwort mit einem Groovy-Skript hinzugefügt, das die Java-API verwendet, um die gerenderten Schlüssel / Wert-Paare abzurufen und zu drucken, sowie einen bash-freundlichen Einzeiler, um sie aufzurufen.
28.
1

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

xextrahiert und Oleitet zu stdout weiter.

Hinweis: Scheint nur in bsdtar zu funktionieren, nicht in GNU tar.

rlovtang
quelle
0

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
ctrueden
quelle