我如何知道哪个版本的Java编译器被用来构建一个jar?我有一个jar文件,它可以构建在三个jdk中的任何一个中。我们需要确切知道是哪一个,这样我们才能证明兼容性。编译器版本是否嵌入到类文件或jar中?


当前回答

在Windows上执行以下操作:

使用WinZip / Java JAR命令解压或解压缩JAR文件。 将其中一个类文件拖放到Eclipse Java项目中。 打开类文件。

现在Eclipse将显示准确的主版本和次版本。

其他回答

你可以在命令行上使用以下过程轻松完成:

如果你知道jar中的任何一个类名,你可以使用以下命令:

javap -cp jarname.jar -verbose packagename.classname | findstr major

例子:

    C:\pathwherejarlocated> javap -cp jackson-databind-2.8.6.jar -verbose com.fasterxml.jackson.databind.JsonMappingException | findstr major

输出:

    major version: 51

快速参考:

JDK 1.0 — major version 45 
DK 1.1 — major version 45 
JDK 1.2 — major version 46 
JDK 1.3 — major version 47 
JDK 1.4 — major version 48 
JDK 1.5 — major version 49 
JDK 1.6 — major version 50 
JDK 1.7 — major version 51 
JDK 1.8 — major version 52 
JDK 1.9 — major version 53 

PS:如果你不知道任何类名,你可以很容易地做到这一点 使用任何jar反编译器或简单地使用以下命令来提取jar文件 : myFile.jar

你可以使用十六进制编辑器从.class文件中找到Java编译器版本。

步骤1: 使用zip提取器从jar文件中提取.class文件

第二步:用十六进制编辑器打开。class文件。(我已经使用notepad++十六进制编辑器插件。这个插件读取文件为二进制并显示为十六进制) 如下图所示。

索引6和7给出了所使用的类文件格式的主要版本号。 https://en.wikipedia.org/wiki/Java_class_file

Java SE 11 = 55 (0x37十六进制)

Java SE 10 = 54 (0x36十六进制)

Java SE 9 = 53 (0x35十六进制)

Java SE 8 = 52 (0x34十六进制),

Java SE 7 = 51 (0x33十六进制),

Java SE 6.0 = 50 (0x32十六进制),

Java SE 5.0 = 49 (0x31十六进制),

JDK 1.4 = 48 (0x30十六进制),

JDK 1.3 = 47 (0x2F十六进制),

JDK 1.2 = 46 (0x2E十六进制),

JDK 1.1 = 45 (0x2D十六进制)。

很多时候,您可能会查看整个jar文件,或者除了它们本身之外还包含许多jar文件的war文件。

因为我不想手动检查每个类,所以我写了一个java程序来做到这一点:

https://github.com/Nthalk/WhatJDK

./whatjdk some.war
some.war:WEB-INF/lib/xml-apis-1.4.01.jar contains classes compatible with Java1.1
some.war contains classes compatible with Java1.6

虽然这并没有说明类是用什么编译的,但它决定了哪些JDK能够加载这些类,这可能是您想要开始的。

为了扩展Jonathon Faust和McDowell的回答:如果你在一个基于*nix的系统上,你可以使用od(最早的Unix程序之一,应该在几乎所有地方都可以使用)在二进制级别上查询.class文件:

od -An -j7 -N1 -t dC SomeClassFile.class

这将输出熟悉的整数值,例如,Java 5输出50,Java 6输出51,等等。

1引用自https://en.wikipedia.org/wiki/Od_(Unix)

您不一定能从JAR文件本身判断出来。

下载一个十六进制编辑器,打开JAR中的一个类文件,查看字节偏移量4到7。版本信息是内置的。

http://en.wikipedia.org/wiki/Java_class_file

注:如以下评论所述,

这些字节告诉你类是为哪个版本编译的,而不是 哪个版本编译了它。