Как прочитать файл MANIFEST.MF из JAR с помощью Bash

Мне нужно прочитать файл манифеста maven MANIFEST.MF из «some.jar», используя bash


person Roman    schedule 15.08.2011    source источник
comment
jar-файлы - это просто zip-файлы.   -  person Graham Clark    schedule 15.08.2011


Ответы (6)


$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q подавляет подробный вывод из программы распаковки
  • -c будет извлекаться в стандартный вывод

Пример:

$ 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

В качестве альтернативы вы можете использовать -p вместо -q -c.

-p извлекать файлы в конвейер (stdout). На стандартный вывод не отправляется ничего, кроме файловых данных, и файлы всегда извлекаются в двоичном формате так же, как они сохраняются (без преобразований).

person miku    schedule 15.08.2011
comment
Я знаю, что эта ветка устарела, но кого это может касаться: Как и в руководстве, извлечение с использованием -p или -c будет печатать вывод в двоичной форме. Если вам нужно как-то разобрать этот вывод (например, в ассоциативный массив), вы должны принудительно использовать текстовое представление с аргументом -aa, чтобы оно было правильным. - person tcigler; 27.09.2016

используйте 1_:

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF

который незаметно (-q) прочитает путь META-INF/MANIFEST.MF из jar-файла (сжатого в формате zip) в стандартный вывод (-c). Затем вы можете передать вывод другой команде, чтобы ответить на такие вопросы, как «какой основной класс для этого jar:

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2

(это удаляет все строки, которые не содержат строку Main-Class, затем разбивает строку на :, оставляя только второе поле, имя класса). Конечно, либо определите $JARFILE_PATH соответствующим образом, либо замените $JARFILE_PATH путем к интересующему вас jar-файлу.

person Bobby Powers    schedule 15.08.2011

В зависимости от вашего дистрибутива установите пакет unzip. Затем просто выдайте

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

Это сбросит содержимое в STDOUT.

ХТН

person Zsolt Botykai    schedule 15.08.2011

Другие писали об использовании unzip -p и подключении к grep или awk или к чему вам нужно. Хотя это работает в большинстве случаев, стоит отметить, что из-за ограничения 72 символа на строку в MANIFEST.MF вы можете искать ключи, значения которых разбиты на несколько строк, и поэтому их будет очень сложно проанализировать. Я бы хотел увидеть инструмент CLI, который действительно может извлекать отображаемое значение из файла.

http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html

person Justin Clayton    schedule 26.06.2015
comment
Я добавил ответ со сценарием Groovy, который использует API Java для получения и печати визуализированных пар ключ/значение, а также удобный для bash однострочник для его вызова. - person ctrueden; 29.04.2020

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

x извлекает и O перенаправляет на стандартный вывод.

Примечание. Похоже, что работает только в bsdtar, а не в GNU tar.

person rlovtang    schedule 09.06.2015

Следующий сценарий Groovy использует API Java для разбора манифеста, избегая проблем со странным разрывом строки в формате манифеста:

#!/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") }
}

Передайте файлы JAR в качестве аргументов:

$ 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

Или, если вы отчаянно нуждаетесь в однострочнике:

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
person ctrueden    schedule 28.04.2020