Necesito leer el archivo de manifiesto MANIFEST.MF maven de "some.jar" usando bash
Respuestas:
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
-q
suprimirá la salida detallada del programa de descompresión-c
extraerá a stdoutEjemplo:
$ 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, puede usar en -p
lugar de -q -c
.
-p extraer archivos a la tubería (stdout). Nada más que los datos del archivo se envían a stdout, y los archivos siempre se extraen en formato binario, tal como se almacenan (sin conversiones).
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.
Dependiendo de su distribución, instale el unzip
paquete. Entonces simplemente emita
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
Esto volcará el contenido a STDOUT.
HTH
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
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:
$ 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 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