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


当前回答

我基于david的建议使用file命令构建了一个小bash脚本(在github上)

其他回答

你检查jar的Manifest文件 例子:

Manifest-Version: 1.0 创建者:1.6.0 (IBM Corporation)

在Windows上执行以下操作:

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

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

你可以使用十六进制编辑器从.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中的一个类文件,查看字节偏移量4到7。版本信息是内置的。

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

注:如以下评论所述,

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

一行程序(Linux)

解压-p mylib.jar META-INF/MANIFEST. jar曼氏金融

这将打印MANIFEST的内容。MF文件转换为stdout(希望你的jar文件中有一个:)

根据构建包的方式,您将在“Created-By”或“Build-Jdk”键中找到JDK版本。