我需要使用bash从“some.jar”读取MANIFEST.MF maven清单文件
答案 0 :(得分:136)
$ 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之外,文件总是以二进制格式提取,就像它们被存储一样(没有转换)。
答案 1 :(得分:16)
使用unzip
:
$ unzip -q -c $JARFILE_PATH META-INF/MANIFEST.MF
将安静地(-q
)从jar文件(使用zip格式压缩)读取路径META-INF / MANIFEST.MF到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
替换为您感兴趣的jar文件的路径。
答案 2 :(得分:4)
根据您的发行版,安装unzip
包。然后简单地发出
unzip -p YOUR_FILE.jar META-INF/MANIFEST.MF
这会将内容转储到STDOUT。
HTH
答案 3 :(得分:1)
$ tar xfO some.jar META-INF/MANIFEST.MF
x
提取并O
重定向到stdout。
注意:似乎只能在bsdtar中工作,而不能在GNU tar中工作。
答案 4 :(得分:1)
其他人一直在发布关于使用unzip -p和管道来grep或awk或任何你需要的东西。虽然这适用于大多数情况,但值得注意的是,由于MANIFEST.MF的每行72个字符的限制,您可能正在考虑其值分为多行的键,因此很难解析。我很高兴看到一个可以实际从文件中提取渲染值的CLI工具。
答案 5 :(得分: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