【问题标题】:Java - Which version was a .jar file built too? [duplicate]Java - 哪个版本也是构建的 .jar 文件? [复制]
【发布时间】:2011-05-25 08:42:57
【问题描述】:

有没有办法找出用于构建 .jar 文件的 JDK 版本?

【问题讨论】:

    标签: java jar


    【解决方案1】:

    这是不可能的,因为您甚至不需要 JDK 来构建 JAR 文件 - 它只是一个包含类和清单文件的 ZIP 文件。

    您可以查到the class file format 使用的是哪个版本。主要版本号映射到主要JDK版本:

    J2SE 6.0 = 50 (0x32 hex)
    J2SE 5.0 = 49 (0x31 hex)
    JDK 1.4 = 48 (0x30 hex)
    JDK 1.3 = 47 (0x2F hex)
    JDK 1.2 = 46 (0x2E hex)
    JDK 1.1 = 45 (0x2D hex)
    

    但是,java 编译器有一个选项可以使用以前版本的类文件格式,这经常用于实现向下兼容。但是,如果您发现类文件版本主编号为 50,您就知道这些类肯定不是使用 Java 5 或更早版本的 JDK 编译的。

    【讨论】:

    • 虽然你说的一切都是正确的,但这确实告诉你什么编译器编译了你的类,而不是什么 jar 工具 jar-ed 你的类。大多数时候,人们会假设它们来自同一个工具包。
    • 答案stackoverflow.com/a/3313839/2776843好多了。也检查一下。
    【解决方案2】:

    大多数 jar 是使用 jdk 打包提供的“jar”工具构建的。

    在 SUN 的 JDK 中,提供的“jar”工具将在嵌入式 META-INF/MANIFEST.MF 文件中添加“Created-By”行。

    该行将指定创建 JAR 的 JDK 版本(在我的例子中是“创建者:1.6.0_17 (Sun Microsystems Inc.)”)

    其他 Java 供应商也倾向于这样做。

    【讨论】:

    • Ant jar任务内部是否使用jar工具?因为我认为更多的 JAR 文件是用 Ant 构建的,而不是通过命令行工具。
    【解决方案3】:

    您可以从jar文件中提取类文件并使用以下命令:

    javap -verbose SomeClass | grep major
    

    应该给你类文件的版本号。

    【讨论】:

      【解决方案4】:

      在 Jars MANIFEST.MF 中可能有一个 Build-Jdk 属性,这应该是您正在寻找的。​​p>

      【讨论】:

      • 我只是压缩了一些类文件,而 Build-Jdk 根本不在 MANIFEST.MF 文件中。
      • 嗯,你可能是对的。我正在看一个带有 Created-By: Apache Maven 的罐子。但是,文档似乎同意您的看法。
      猜你喜欢
      • 2019-08-26
      • 2015-03-07
      • 2020-03-13
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多