Мне нужно прочитать файл манифеста maven MANIFEST.MF из "some.jar" с помощью bash
Ответы:
$ 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 распаковать файлы в канал (стандартный вывод). Ничего, кроме данных файла, не отправляется на стандартный вывод, и файлы всегда извлекаются в двоичном формате, как и хранятся (без преобразований).
использование unzip
:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
который незаметно ( -q
) прочитает путь META-INF / MANIFEST.MF из jarfile (сжатого с использованием формата zip) в stdout ( -c
). Затем вы можете передать вывод другой команде, чтобы ответить на такие вопросы, как «какой основной класс для этой банки:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2
(это удаляет все строки, которые не содержат строку Main-Class
, затем разделяет строку на :
, сохраняя только второе поле, имя класса). Конечно, либо определите $JARFILE_PATH
надлежащим образом, либо замените $JARFILE_PATH
на путь к интересующему вас jar-файлу.
В зависимости от вашего дистрибутива установите unzip
пакет. Тогда просто выдайте
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
Это сбрасывает содержимое в STDOUT.
HTH
Другие писали об использовании unzip -p и piping для grep или awk или чего-то еще, что вам нужно. Хотя это работает в большинстве случаев, стоит отметить, что из-за ограничения в 72 символа на строку для MANIFEST.MF вы можете искать ключи, значения которых разделены на несколько строк и поэтому их будет очень сложно проанализировать. Мне бы хотелось увидеть инструмент CLI, который действительно может извлекать визуализированное значение из файла.
http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html
Следующий скрипт 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