Bashを使用してJARからMANIFEST.MFファイルを読み取る方法


回答:


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 2016

19

使用unzip

$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF

これにより-q、パスMETA-INF / MANIFEST.MFがjarファイル(zip形式を使用して圧縮されている)からstdout(-c)に静かに()読み取られます。次に、出力を他のコマンドにパイプして、「このjarのメインクラスは何ですか」などの質問に答えることができます。

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

(これにより、文字列を含まないすべての行が削除されMain-Class、次に行がで分割され:、2番目のフィールドであるクラス名のみが保持されます)。もちろん、$JARFILE_PATH適切に定義するか、$JARFILE_PATH関心のあるjarファイルへのパスに置き換えてください。


4

ディストリビューションに応じて、unzipパッケージをインストールします。次に、単に発行します

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

これにより、内容がSTDOUTにダンプされます。

HTH


1

unzip -pの使用や、grepやawkなどの必要なものへのパイピングについて投稿している人もいます。これはほとんどの場合に機能しますが、MANIFEST.MFの1行あたり72文字の制限があるため、値が複数行に分割されているために解析が非常に難しいキーをgrepしている可能性があることに注意してください。レンダリングされた値をファイルから実際に引き出すことができる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抽出しOてstdoutにリダイレクトします。

注: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.