Eu preciso ler o arquivo de manifesto MANIFEST.MF maven de "some.jar" usando o bash
Respostas:
$ 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 stdoutExemplo:
$ 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 -p
vez 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).
usar unzip
:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
que irá -q
ler 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_PATH
apropriadamente ou substitua $JARFILE_PATH
pelo caminho para um arquivo jar do seu interesse.
Dependendo da sua distribuição, instale o unzip
pacote. Em seguida, basta emitir
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
Isso irá despejar o conteúdo em STDOUT.
HTH
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
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