Tôi cần đọc tệp kê khai MANIFEST.MF maven từ "some.jar" bằng cách sử dụng bash
Câu trả lời:
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
-q
sẽ chặn đầu ra dài dòng từ chương trình giải nén-c
sẽ giải nén thành stdoutThí dụ:
$ 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
Ngoài ra bạn có thể sử dụng -p
thay thế -q -c
.
-p giải nén các tập tin vào đường ống (stdout). Không có gì ngoài dữ liệu tệp được gửi đến stdout và các tệp luôn được trích xuất ở định dạng nhị phân, giống như chúng được lưu trữ (không có chuyển đổi).
sử dụng unzip
:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
điều đó sẽ lặng lẽ ( -q
) đọc đường dẫn META-INF / MANIFEST.MF từ tệp jar (được nén bằng định dạng zip) đến stdout ( -c
). Sau đó, bạn có thể chuyển đầu ra tới lệnh khác để trả lời các câu hỏi như 'lớp chính cho jar này là gì:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF | grep 'Main-Class' | cut -d ':' -f 2
(điều này loại bỏ tất cả các dòng không chứa chuỗi Main-Class
, sau đó tách dòng tại :
, chỉ giữ lại trường thứ hai, tên lớp). Tất nhiên, hãy xác định $JARFILE_PATH
một cách thích hợp hoặc thay thế $JARFILE_PATH
bằng đường dẫn đến một tệp jar mà bạn quan tâm.
Tùy thuộc vào bản phân phối của bạn, hãy cài đặt unzip
gói. Sau đó, chỉ cần phát hành
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
Điều này sẽ kết xuất nội dung vào STDOUT.
HTH
Những người khác đã đăng bài về việc sử dụng giải nén -p và đường ống để chuyển sang grep hoặc awk hoặc bất cứ thứ gì bạn cần. Mặc dù điều đó hoạt động đối với hầu hết các trường hợp, nhưng cần lưu ý rằng do giới hạn 72 ký tự trên mỗi dòng của MANIFEST.MF, bạn có thể phân tích các khóa có giá trị được chia thành nhiều dòng và do đó sẽ rất khó phân tích cú pháp. Tôi muốn thấy một công cụ CLI thực sự có thể kéo một giá trị được kết xuất ra khỏi tệp.
http://delaltctrl.blogspot.com/2009/11/manifestmf-appollen-you-are-just.html
Tập lệnh Groovy sau sử dụng API của Java để phân tích cú pháp tệp kê khai, tránh các vấn đề với việc ngắt dòng kỳ lạ của định dạng tệp kê khai:
#!/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") }
}
Chuyển tệp JAR làm đối số:
$ 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
Hoặc nếu bạn đang tuyệt vọng cho một lớp lót:
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