如何检查用于编译 .class 文件的 JDK 版本

333

我正试图调试一个Java中的 "Bad version number in .class file" 错误,有没有一种方法可以检查 .class 文件的版本?

我正在使用JRE1.5.0_6,但我的JDK版本是1.6.0_13。

我在Eclipse中将兼容性模式设置为1.5进行编译,但我认为这应该有效...

可能重复:
用于读取并显示 Java .class 版本的工具


请参见https://dev59.com/AXRB5IYBdhLWcg3wLUu3。 - Jonathan Holloway
请查看javadoc以获取有关主要版本和次要版本的更多信息。 - WiseGeek
5个回答

727
你在命令行上寻找这个(对于一个叫做MyClass的类):
在Unix/Linux上:
javap -verbose MyClass | grep "major"

在Windows上:
javap -verbose MyClass | findstr "major"

你想要结果中的“主要”版本。以下是一些示例数值:
Java版本 主要版本
1.2 46
1.3 47
1.4 48
5 49
6 50
7 51
8 52
9 53
10 54
11 55
12 56
13 57
14 58
15 59
16 60
17 61
18 62
19 63
20 64
21 65

57
或者,如果您通过十六进制编辑器打开类文件,可以查看第7和第8字节。该数字将映射到上面答案中给出的数字。例如,00 2E -> JDK 1.2 = 46(0x2E十六进制)。如果您无法访问javap,则此方法很有用。参考:http://en.wikipedia.org/wiki/Java_class_file#General_layout - Jim
23
你可以加上 "-cp <jar>",然后输入类名,这样你就可以从现有的 jar 包中获取该类。 - Christian Bongiorno
3
我必须在命令中删除“.class”,否则会收到“错误:找不到foo.class”的消息。这样做,“javap -verbose foo | grep "major"”就有效了。提醒一下。https://dev59.com/32Yr5IYBdhLWcg3w29hI - Kyle Bridenstine
2
正如Jim所建议的那样,对于vi爱好者:输入“vi MyClass”,然后输入“<Esc> :!xxd”,再查看第8个字节;0x31、0x32、0x33、0x34、0x35分别代表Java 5、6、7、8、9。输入“<Esc> :q!”退出vi。 - user3526918
1
清单 Build-Jdk 似乎是制作 jar 文件的 JDK,这可能与编译器的 JDK 不同。 - Bruce
显示剩余6条评论

17

顺便说一下,你遇到问题的原因是Java编译器识别了两个版本标志。有-source 1.5,它假定使用Java 1.5级源代码,还有-target 1.5,它将发出Java 1.5兼容的类文件。您可能需要同时使用这两个开关,但肯定需要-target 1.5;请确保Eclipse正在执行正确的操作。


9

6

3
< p>您的java命令中的-verbose标志是否提供了任何有用的信息?如果没有,也许 java -X 可以显示与您版本相关的特定信息,可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接