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


当前回答

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

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

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

注:如以下评论所述,

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

其他回答

IntelliJ Users

安装插件Archive Browser

在Intellij中打开罐子通过从文件浏览器中拖拽jar文件,您可以简单地将jar添加到任何项目中。 浏览jar文件以找到一个类文件,IntelliJ的反编译器应该显示用于创建jar的Java版本。

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

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

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

注:如以下评论所述,

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

下面是Java查找这些信息的方法。

Windows: javap -v <class> | findstr major Unix: javap -v <class> | grep major

例如: > javap -v应用程序| findstr major 主要版本:51

您可以通过检查前8个字节(或使用可以的应用程序)来判断Java二进制版本。

据我所知,编译器本身并没有插入任何标识签名。无论如何,我不能在文件VM规范类格式中发现这样的东西。

你可以使用十六进制编辑器从.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十六进制)。