Jak czytać plik MANIFEST.MF z JAR za pomocą Bash

92

Muszę przeczytać plik manifestu MANIFEST.MF maven z „some.jar” przy użyciu bash

rzymski
źródło
4
Pliki jar to po prostu pliki zip.
Graham Clark

Odpowiedzi:

158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q pominie szczegółowe dane wyjściowe z programu rozpakującego
  • -c wypakuje na stdout

Przykład:

$ 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

Alternatywnie możesz użyć -pzamiast -q -c.

-p wypakuj pliki do potoku (stdout). Nic poza danymi pliku są wysyłane na standardowe wyjście, a pliki są zawsze wyodrębniane w formacie binarnym, tak jak są przechowywane (bez konwersji).

miku
źródło
2
Wiem, że ten wątek jest stary, ale kogo to może dotyczyć: Tak jak w podręczniku, wyodrębnienie za pomocą -p lub -c wypisze wynik w postaci binarnej. Jeśli chcesz jakoś przeanalizować to wyjście (na przykład do tablicy asocjacyjnej), powinieneś wymusić reprezentację tekstu z argumentem -aa, aby było poprawne.
tcigler
19

zastosowanie unzip:

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

który po cichu ( -q) odczyta ścieżkę META-INF / MANIFEST.MF z pliku jarfile (który jest skompresowany przy użyciu formatu zip) do stdout ( -c). Następnie możesz przesłać dane wyjściowe do innego polecenia, aby odpowiedzieć na pytania typu `` jaka jest główna klasa tego pliku jar:

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2

(To usuwa wszystkie linie, które nie zawierają łańcucha Main-Class, a następnie dzieli linię na :, pozostawiając tylko drugie pole, nazwę klasy). Oczywiście albo $JARFILE_PATHodpowiednio zdefiniuj, albo zastąp $JARFILE_PATHścieżką prowadzącą do łobuza, którym jesteś zainteresowany.

Bobby Powers
źródło
4

W zależności od dystrybucji zainstaluj unzippakiet. Następnie po prostu wystaw

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

Spowoduje to zrzucenie zawartości do STDOUT.

HTH

Zsolt Botykai
źródło
1

Inni piszą o używaniu unzip -p i pipingu do grep, awk lub czegokolwiek, czego potrzebujesz. Chociaż działa to w większości przypadków, warto zauważyć, że ze względu na limit 72 znaków w linii w MANIFEST.MF, możesz wyszukiwać klucze, których wartości są podzielone na wiele wierszy i dlatego będą bardzo trudne do przeanalizowania. Chciałbym zobaczyć narzędzie CLI, które może faktycznie wyciągnąć renderowaną wartość z pliku.

http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html

Justin Clayton
źródło
Dodałem odpowiedź za pomocą skryptu Groovy, który wykorzystuje API Java do uzyskiwania i drukowania renderowanych par klucz / wartość, a także przyjazną dla basha jednowierszową, aby ją wywołać.
ctrueden
1

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

xwypakowuje i Oprzekierowuje na standardowe wyjście.

Uwaga: Wydaje się, że działa tylko w bsdtar, a nie w GNU tar.

rlovtang
źródło
0

Poniższy skrypt Groovy wykorzystuje API Java do analizowania manifestu, unikając problemów z dziwnym łamaniem linii w formacie manifestu:

#!/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") }
}

Przekaż pliki JAR jako argumenty:

$ 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

Lub jeśli desperacko szukasz jednej linijki:

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
źródło