Cách đọc tệp MANIFEST.MF từ JAR bằng Bash


92

Tôi cần đọc tệp kê khai MANIFEST.MF maven từ "some.jar" bằng cách sử dụng bash


4
tệp jar chỉ là tệp zip.
Graham Clark

Câu trả lời:


158
$ 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 stdout

Thí 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 -pthay 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).


2
Tôi biết luồng này đã cũ, nhưng nó có thể lo lắng cho ai: Như từ hướng dẫn sử dụng, giải nén bằng -p hoặc -c sẽ in đầu ra ở dạng nhị phân. Nếu bạn cần phân tích cú pháp đầu ra này bằng cách nào đó (ví dụ như với mảng kết hợp), bạn nên buộc biểu diễn văn bản với đối số -aa, để nó chính xác.
tcigler

19

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_PATHmột cách thích hợp hoặc thay thế $JARFILE_PATHbằng đường dẫn đến một tệp jar mà bạn quan tâm.


4

Tùy thuộc vào bản phân phối của bạn, hãy cài đặt unzipgó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


1

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ôi đã thêm câu trả lời bằng tập lệnh Groovy sử dụng API của Java để lấy và in các cặp khóa / giá trị được hiển thị, cũng như một lớp lót thân thiện với bash để gọi nó.
ctrueden

1

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

xtrích xuất và Ochuyển hướng đến stdout.

Lưu ý: Có vẻ như chỉ hoạt động trong bsdtar, không phải tar GNU.


0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.