Necesito leer el archivo de manifiesto MANIFEST.MF maven de "some.jar" usando bash
bash
jar
manifest.mf
romano
fuente
fuente
Respuestas:
-q
suprimirá la salida detallada del programa de descompresión-c
extraerá a stdoutEjemplo:
Alternativamente, puede usar en
-p
lugar de-q -c
.fuente
utilizar
unzip
:$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
que silenciosamente (
-q
) leerá la ruta META-INF / MANIFEST.MF desde el archivo jar (que está comprimido usando el formato zip) a stdout (-c
). Luego puede canalizar la salida a otro comando para responder preguntas como '¿Cuál es la clase principal para este jar?$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2
(esto elimina todas las líneas que no contienen la cadena
Main-Class
, luego divide la línea en:
, manteniendo solo el segundo campo, el nombre de la clase). Por supuesto, defina$JARFILE_PATH
apropiadamente o reemplácelo$JARFILE_PATH
con la ruta a un archivo jar que le interese.fuente
Dependiendo de su distribución, instale el
unzip
paquete. Entonces simplemente emitaEsto volcará el contenido a STDOUT.
HTH
fuente
Otros han estado publicando sobre el uso de unzip -p y la canalización para grep o awk o lo que sea que necesite. Si bien eso funciona para la mayoría de los casos, vale la pena señalar que debido al límite de 72 caracteres por línea de MANIFEST.MF, es posible que esté buscando claves cuyos valores se dividen en varias líneas y, por lo tanto, serán muy difíciles de analizar. Me encantaría ver una herramienta CLI que realmente pueda extraer un valor renderizado del archivo.
http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html
fuente
$ tar xfO some.jar META-INF/MANIFEST.MF
x
extrae yO
redirige a stdout.Nota: Parece funcionar solo en bsdtar, no en GNU tar.
fuente
El siguiente script Groovy usa la API de Java para analizar el manifiesto, evitando problemas con los extraños saltos de línea del formato del manifiesto:
#!/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") } }
Pase archivos JAR como argumentos:
O si está desesperado por una sola línea:
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
fuente