Como ler o arquivo MANIFEST.MF do JAR usando o Bash

92

Eu preciso ler o arquivo de manifesto MANIFEST.MF maven de "some.jar" usando o bash

romano
fonte
4
arquivos jar são apenas arquivos zip.
Graham Clark

Respostas:

158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q irá suprimir a saída detalhada do programa de descompactação
  • -c irá extrair para stdout

Exemplo:

$ 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

Alternativamente, você pode usar em -pvez de -q -c.

-p extrai os arquivos para o pipe (stdout). Nada além dos dados do arquivo é enviado ao stdout, e os arquivos são sempre extraídos em formato binário, da mesma forma que são armazenados (sem conversões).

Miku
fonte
2
Eu sei que este tópico é antigo, mas para quem pode interessar: Como no manual, extrair usando -p ou -c irá imprimir a saída em formato binário. Se você precisar analisar esta saída de alguma forma (por exemplo, para um array associativo), você deve forçar a representação de texto com o argumento -aa, para corrigi-lo.
tcigler
19

usar unzip:

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

que irá -qler silenciosamente ( ) o caminho META-INF / MANIFEST.MF do jarfile (que é compactado usando o formato zip) para stdout ( -c). Você pode então canalizar a saída para outro comando para responder a perguntas como 'qual é a classe principal para este jar:

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

(isso remove todas as linhas que não contêm a string Main-Class, então divide a linha :, mantendo apenas o segundo campo, o nome da classe). Claro, defina $JARFILE_PATHapropriadamente ou substitua $JARFILE_PATHpelo caminho para um arquivo jar do seu interesse.

Bobby Powers
fonte
4

Dependendo da sua distribuição, instale o unzippacote. Em seguida, basta emitir

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

Isso irá despejar o conteúdo em STDOUT.

HTH

Zsolt Botykai
fonte
1

Outros têm postado sobre como usar unzip -p e piping para grep ou awk ou o que você precisar. Embora isso funcione na maioria dos casos, é importante notar que, devido ao limite de 72 caracteres por linha de MANIFEST.MF, você pode estar procurando por chaves cujos valores são divididos em várias linhas e, portanto, será muito difícil de analisar. Adoraria ver uma ferramenta CLI que pudesse realmente extrair um valor renderizado do arquivo.

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

Justin Clayton
fonte
Eu adicionei uma resposta com um script Groovy que usa a API do Java para obter e imprimir os pares de chave / valor renderizados, bem como uma linha simples de bash para invocá-lo.
ctrueden
1

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

xextrai e Oredireciona para stdout.

Nota: Parece funcionar apenas em bsdtar, não GNU tar.

Rlovtang
fonte
0

O seguinte script Groovy usa a API do Java para analisar o manifesto, evitando problemas com a quebra de linha estranha do formato do manifesto:

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

Passe arquivos JAR como argumentos:

$ 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 se você está desesperado por uma linha:

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
fonte