Cara membaca file MANIFEST.MF dari JAR menggunakan Bash


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


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.


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


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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.