Cómo leer el archivo MANIFEST.MF de JAR usando Bash

92

Necesito leer el archivo de manifiesto MANIFEST.MF maven de "some.jar" usando bash

romano
fuente
4
Los archivos jar son simplemente archivos zip.
Graham Clark

Respuestas:

158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q suprimirá la salida detallada del programa de descompresión
  • -c extraerá a stdout

Ejemplo:

$ 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 -plugar 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).

miku
fuente
2
Sé que este hilo es antiguo, pero a quién le puede interesar: a partir del manual, la extracción con -p o -c imprimirá la salida en forma binaria. Si necesita analizar esta salida de alguna manera (por ejemplo, a una matriz asociativa), debe forzar la representación del texto con el argumento -aa, para que sea correcta.
tcigler
19

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_PATHapropiadamente o reemplácelo $JARFILE_PATHcon la ruta a un archivo jar que le interese.

Bobby Powers
fuente
4

Dependiendo de su distribución, instale el unzippaquete. Entonces simplemente emita

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

Esto volcará el contenido a STDOUT.

HTH

Zsolt Botykai
fuente
1

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

Justin Clayton
fuente
Agregué una respuesta con un script Groovy que usa la API de Java para obtener e imprimir los pares clave / valor renderizados, así como una línea simple para bash para invocarlo.
ctrueden
1

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

xextrae y Oredirige a stdout.

Nota: Parece funcionar solo en bsdtar, no en GNU tar.

rlovtang
fuente
0

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
ctrueden
fuente