Come leggere il file MANIFEST.MF da JAR utilizzando Bash


Risposte:


158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q sopprimerà l'output dettagliato dal programma di decompressione
  • -c estrarrà in stdout

Esempio:

$ 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

In alternativa puoi usare al -pposto di -q -c.

-p estrae i file su pipe (stdout). Nient'altro che i dati del file vengono inviati allo stdout, ei file vengono sempre estratti in formato binario, così come vengono memorizzati (nessuna conversione).


2
So che questo thread è vecchio, ma per chi può interessare: come dal manuale, l'estrazione usando -p o -c stamperà l'output in formato binario. Se hai bisogno di analizzare questo output in qualche modo (ad esempio per un array associativo), dovresti forzare la rappresentazione del testo con l'argomento -aa, per averlo corretto.
tcigler

19

utilizzare unzip:

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

che -qleggerà quietamente ( ) il percorso META-INF / MANIFEST.MF dal file jar (che è compresso utilizzando il formato zip) a stdout ( -c). È quindi possibile reindirizzare l'output ad un altro comando per rispondere a domande come 'qual è la classe principale per questo jar:

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

(questo rimuove tutte le righe che non contengono la stringa Main-Class, quindi divide la riga in :, mantenendo solo il secondo campo, il nome della classe). Ovviamente, definisci in modo $JARFILE_PATHappropriato o sostituisci $JARFILE_PATHcon il percorso di un file jar che ti interessa.


4

A seconda della distribuzione, installa il unzippacchetto. Quindi emetti semplicemente

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

Questo scaricherà il contenuto su STDOUT.

HTH


1

Altri hanno scritto sull'uso di unzip -p e piping a grep o awk o qualsiasi altra cosa di cui hai bisogno. Sebbene funzioni per la maggior parte dei casi, vale la pena notare che a causa del limite di 72 caratteri per riga di MANIFEST.MF, potresti essere avido di chiavi i cui valori sono suddivisi su più righe e sarà quindi molto difficile da analizzare. Mi piacerebbe vedere uno strumento CLI in grado di estrarre un valore di rendering dal file.

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


Ho aggiunto una risposta con uno script Groovy che utilizza l'API di Java per ottenere e stampare le coppie chiave / valore renderizzate, oltre a una riga di comando semplice per invocarla.
ctrueden

1

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

xestrae e Oreindirizza a stdout.

Nota: sembra funzionare solo in bsdtar, non GNU tar.


0

Il seguente script Groovy utilizza l'API di Java per analizzare il manifest, evitando problemi con la strana interruzione di riga del formato manifest:

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

Passa i file JAR come argomenti:

$ 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

O se sei alla disperata ricerca di una battuta:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.