Cara membaca file MANIFEST.MF dari JAR menggunakan Bash

92

Saya perlu membaca file manifes Maven MANIFEST.MF dari "some.jar" menggunakan bash

Roma
sumber
4
file jar hanyalah file zip.
Graham Clark

Jawaban:

158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q akan menekan keluaran verbose dari program unzip
  • -c akan mengekstrak ke stdout

Contoh:

$ 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

Atau Anda dapat menggunakan -pbukan -q -c.

-p ekstrak file ke pipa (stdout). Tidak ada apapun kecuali data file yang dikirim ke stdout, dan file tersebut selalu diekstraksi dalam format biner, sama seperti mereka disimpan (tanpa konversi).

miku
sumber
2
Saya tahu utas ini sudah tua, tetapi untuk siapa yang berkepentingan: Dari manual, mengekstrak menggunakan -p atau -c akan mencetak output dalam bentuk biner. Jika Anda perlu mengurai keluaran ini (misalnya ke array asosiatif), Anda harus memaksa representasi teks dengan argumen -aa, agar benar.
tcigler
19

penggunaan unzip:

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

yang diam-diam akan ( -q) membaca jalur META-INF / MANIFEST.MF dari jarfile (yang dikompresi menggunakan format zip) ke stdout ( -c). Anda kemudian dapat menyalurkan output ke perintah lain untuk menjawab pertanyaan seperti 'apa kelas utama untuk jar ini:

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

(ini menghapus semua baris yang tidak berisi string Main-Class, lalu memisahkan baris di :, hanya menyimpan bidang kedua, nama kelas). Tentu saja, tentukan dengan $JARFILE_PATHtepat atau ganti $JARFILE_PATHdengan jalur ke jarfile yang Anda minati.

Bobby Powers
sumber
4

Bergantung pada distribusi Anda, instal unzippaket. Kemudian cukup keluarkan

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

Ini akan membuang konten ke STDOUT.

HTH

Zsolt Botykai
sumber
1

Orang lain telah memposting tentang penggunaan unzip -p dan piping ke grep atau awk atau apapun yang Anda butuhkan. Meskipun itu berfungsi untuk sebagian besar kasus, perlu dicatat bahwa karena batas MANIFEST.MF 72 karakter per baris, Anda mungkin mencari kunci yang nilainya dibagi menjadi beberapa baris dan oleh karena itu akan sangat sulit untuk diurai. Saya ingin melihat alat CLI yang benar-benar dapat menarik nilai yang diberikan dari file.

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

Justin Clayton
sumber
Saya menambahkan jawaban dengan skrip Groovy yang menggunakan API Java untuk mendapatkan dan mencetak pasangan kunci / nilai yang dirender, serta satu baris ramah-bash untuk memanggilnya.
ctrueden
1

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

xekstrak dan Odialihkan ke stdout.

Catatan: Sepertinya hanya bekerja di bsdtar, bukan GNU tar.

rlovtang.dll
sumber
0

Skrip Groovy berikut menggunakan API Java untuk mengurai manifes, menghindari masalah dengan pemutusan baris aneh format manifes:

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

Teruskan file JAR sebagai argumen:

$ 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

Atau jika Anda sangat membutuhkan satu baris:

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
sumber