【问题标题】:How to read MANIFEST.MF file from JAR using Bash如何使用 Bash 从 JAR 中读取 MANIFEST.MF 文件
【发布时间】:2011-10-27 07:42:09
【问题描述】:

我需要使用 bash 从“some.jar”中读取 MANIFEST.MF maven 清单文件

【问题讨论】:

  • jar 文件只是 zip 文件。

标签: bash jar manifest.mf


【解决方案1】:

以下 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

【讨论】:

    【解决方案2】:

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

    x 提取和O 重定向到标准输出。

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

    【讨论】:

      【解决方案3】:

      其他人一直在发布有关使用 unzip -p 和管道连接到 grep 或 awk 或任何您需要的东西的帖子。虽然这适用于大多数情况,但值得注意的是,由于 MANIFEST.MF 的每行 72 个字符的限制,您可能正在寻找其值被拆分为多行的键,因此很难解析。我很想看到一个 CLI 工具,它实际上可以从文件中提取渲染值。

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

      【讨论】:

      • 我用一个 Groovy 脚本添加了一个答案,该脚本使用 Java 的 API 来获取和打印呈现的键/值对,以及一个 bash 友好的单行代码来调用它。
      【解决方案4】:

      根据您的发行版,安装unzip 软件包。然后只需发出

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

      这会将内容转储到 STDOUT。

      HTH

      【讨论】:

        【解决方案5】:

        使用unzip:

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

        这将悄悄地 (-q) 从 jarfile(使用 zip 格式压缩)读取路径 META-INF/MANIFEST.MF 到标准输出 (-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的路径。

        【讨论】:

          【解决方案6】:
          $ 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 提取文件到管道(标准输出)。只有文件数据被发送到标准输出,并且文件总是以二进制格式提取,就像它们被存储一样(没有转换)。

          【讨论】:

          • 我知道这个线程已经过时了,但它可能关心的人:从手册中,使用 -p 或 -c 提取将以二进制形式打印输出。如果您需要以某种方式解析此输出(例如关联数组),则应强制使用 -aa 参数表示文本以使其正确。
          猜你喜欢
          • 2011-04-16
          • 1970-01-01
          • 1970-01-01
          • 2017-01-26
          • 2018-07-23
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          相关资源
          最近更新 更多