Bash를 사용하여 JAR에서 MANIFEST.MF 파일을 읽는 방법


92

bash를 사용하여 "some.jar"에서 MANIFEST.MF maven 매니페스트 파일을 읽어야합니다.


4
jar 파일은 단지 zip 파일입니다.
Graham Clark

답변:


158
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q 압축 해제 프로그램에서 자세한 출력을 억제합니다.
  • -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) jarfile (zip 형식을 사용하여 압축 된)에서 stdout ( -c) 으로 경로 META-INF / MANIFEST.MF를 읽습니다 . 그런 다음 출력을 다른 명령으로 파이프하여 '이 jar의 기본 클래스는 무엇입니까?'와 같은 질문에 답할 수 있습니다.

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

(문자열을 포함하지 않는 모든 줄을 제거한 Main-Class다음 :두 번째 필드 인 클래스 이름 만 유지하면서 줄을에서 분할합니다 .) 물론 $JARFILE_PATH적절하게 정의 하거나 $JARFILE_PATH관심있는 jar 파일의 경로로 바꾸십시오 .


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


Java의 API를 사용하여 렌더링 된 키 / 값 쌍을 가져오고 인쇄하는 Groovy 스크립트와이를 호출하는 bash 친화적 인 한 줄짜리 답변을 추가했습니다.
ctrueden

1

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

x추출하고 Ostdout으로 리디렉션합니다.

참고 : GNU tar가 아닌 bsdtar에서만 작동하는 것 같습니다.


0

다음 Groovy 스크립트는 Java의 API를 사용하여 매니페스트를 구문 분석하여 매니페스트 형식의 이상한 줄 바꿈 문제를 방지합니다.

#!/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.