如何使用Bash从JAR读取MANIFEST.MF文件


Answers:


157
$ unzip -q -c myarchive.jar META-INF/MANIFEST.MF
  • -q 将取消解压缩程序的详细输出
  • -c 将提取到标准输出

例:

$ 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)从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为您感兴趣的jarfile的路径。


4

根据您的分发,安装unzip软件包。然后简单地发出

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

这会将内容转储到STDOUT。

高温超导


1

其他人已经发布了有关使用unzip -p以及管道传递给grep或awk或您需要的任何内容的信息。尽管这在大多数情况下可行,但值得注意的是,由于MANIFEST.MF的每行限制为72个字符,因此您可能会抓紧其值分散在多行中的键,因此将很难解析。我很想看到一个CLI工具,它实际上可以从文件中提取渲染值。

http://delaltctrl.blogspot.com/2009/11/manifestmf-apparently-you-are-just.html


我用Groovy脚本添加了一个答案,该脚本使用Java的API获取并打印呈现的键/值对,以及bash友好的单行代码来调用它。
ctrueden

1

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

x提取并O重定向到stdout。

注意:似乎只能在bsdtar中工作,而不能在GNU tar中工作。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.