Як прочитати файл MANIFEST.MF з JAR за допомогою Bash


Відповіді:


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

Приклад:

$ 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). Ніщо, крім даних файлу, не надсилається в stdout, і файли завжди витягуються у двійковому форматі, як і зберігаються (без перетворення).


2
Я знаю, що цей потік застарілий, але для кого це може стосуватися: Як з посібника, витяг за допомогою -p або -c надрукує висновок у бінарній формі. Якщо вам потрібно якось проаналізувати цей результат (наприклад, для асоціативного масиву), вам слід змусити текстове представлення аргументом -aa, щоб він був правильним.
tcigler

19

використання unzip:

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

що буде тихо ( -q) читати шлях META-INF / MANIFEST.MF з файлу jar (який стискається із використанням формату zip) до stdout ( -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.


4

Встановіть unzipпакет залежно від вашого розповсюдження . Тоді просто видайте

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

Це призведе до скидання вмісту до STDOUT.

HTH


1

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

http://delaltctrl.blogspot.com/2009/11/manifestmf-ap очевидно- ти-аре-юст.html


Я додав відповідь із сценарієм Groovy, який використовує API Java для отримання та друку відтворених пар ключ / значення, а також зручний для вкладених кодів один вкладиш для його виклику.
ctrueden

1

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

xвитягує та Oперенаправляє до stdout.

Примітка: Здається, працює тільки в bsdtar, а не в GNU tar.


0

Наступний сценарій 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.