วิธีอ่านไฟล์ MANIFEST.MF จาก JAR โดยใช้ Bash


คำตอบ:


158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q จะระงับเอาต์พุต verbose จากโปรแกรมคลายซิป
  • -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 อย่างเงียบ ๆจาก jarfile (ซึ่งบีบอัดโดยใช้รูปแบบ 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ด้วยเส้นทางไปยัง jarfile ที่คุณสนใจ


4

ติดตั้งunzipแพคเกจขึ้นอยู่กับการกระจายของคุณ จากนั้นก็ออก

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

การดำเนินการนี้จะถ่ายโอนเนื้อหาไปยัง STDOUT

HTH


1

คนอื่น ๆ ได้โพสต์เกี่ยวกับการใช้ unzip -p และ piping ไปที่ grep หรือ awk หรืออะไรก็ตามที่คุณต้องการ แม้ว่าจะใช้งานได้กับกรณีส่วนใหญ่ แต่ก็น่าสังเกตว่าเนื่องจาก MANIFEST.MF มีขีด จำกัด 72 อักขระต่อบรรทัดคุณอาจต้องจับคีย์ที่มีการแบ่งค่าออกเป็นหลายบรรทัดดังนั้นจึงยากที่จะแยกวิเคราะห์ ฉันอยากเห็นเครื่องมือ CLI ที่สามารถดึงค่าที่แสดงผลออกจากไฟล์ได้

http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.