Eu preciso ler o arquivo de manifesto MANIFEST.MF maven de "some.jar" usando o bash
bash
jar
manifest.mf
romano
fonte
fonte
Respostas:
-q
irá suprimir a saída detalhada do programa de descompactação-c
irá extrair para stdoutExemplo:
Alternativamente, você pode usar em
-p
vez de-q -c
.fonte
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.fonte
Dependendo da sua distribuição, instale o
unzip
pacote. Em seguida, basta emitirIsso irá despejar o conteúdo em STDOUT.
HTH
fonte
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
fonte
$ tar xfO some.jar META-INF/MANIFEST.MF
x
extrai eO
redireciona para stdout.Nota: Parece funcionar apenas em bsdtar, não GNU tar.
fonte
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:
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
fonte