Java类文件格式的主要版本号列表?

559
我在另一篇帖子中看到了Java的主要版本号列表。
Java 主要版本
22 66
21 65
20 64
19 63
18 62
17 61
16 60
15 59
14 58
13 57
12 56
11 55
10 54
9 53
8 52
7 51
6 50
5 49
1.4 48
1.3 47
1.2 46
1.1 45
1.0.2 45
这个列表是从哪里来的?有没有具体的参考资料?最好是能显示次要版本的东西。
7个回答

136

这些来自class版本。如果你试图在java 5运行时加载为java 6编译的内容,你会得到错误消息:“不兼容的类版本,实际版本是50,期望版本是49”。或者类似这样的错误。

关于此更多信息请参见此处,其中第7字节偏移量有详细说明。

另外还可以在此处找到其他信息。


有没有一种方法可以直接从 javac 输出主版本号(类版本),而不使用像 javap -verbose MyClass 这样的现有类? - samus
1
没有。 - Stephen C
1
@samus 可以通过 java 命令来实现,具体请参考这个答案 - LMC

48

29

11

如果您有一个位于build/com/foo/Hello.class的类文件,您可以使用以下命令检查它是在哪个Java版本编译的:

javap -verbose build/com/foo/Hello.class | grep "major version"
javap -v <path to class file> | grep "major"

使用示例:

$ javap -v build/classes/com/example/Book.class | grep major
  
major version: 57

根据原帖中的表格,主版本号57表示类文件编译为JDK 13字节码级别。


file /path/to/a.class 返回一个类的主要版本,而 java -XshowSettings:properties -version 返回本地 java.class.version - Vladislav Povorozniuc

4

(实际上这更像是一条扩展评论而不是答案...)

问题是关于“版本列表从哪里来”的。

这个回复中已经回答了这个问题,它引用了JAVA SE规范中的"class文件格式"。似乎这非常权威(它也被引用在字节6(主要版本)值的维基上),因此应该接受这个答案。


几个答案似乎侧重于如何使用 javap 来确定值或不使用它。这些应该是分开的问题。然而,一种非 javap 的找到版本的方法是 Unix 命令 filefile 读取 magic,其在 ClassFile 结构 中指定。
例如:file myClass.class,或者更加优雅的是,file -b myClass.class | awk -F',' '{print $NF}' 例如:
$ find * -name "*.class" -exec file -b {} \; | awk -F',' '{print $NF}' | sort -u
 version 45.3
 version 50.0 (Java 1.6)
 version 52.0 (Java 1.8)

3

如果你遇到"类文件编译器错误"的问题,可以通过在Eclipse中将项目的JRE更改为其对应版本来解决。

  1. 构建路径
  2. 配置构建路径
  3. 更改库以对应上表友人最后一次显示的版本。
  4. 创建"jar文件",然后进行编译和执行。

我这样做了,结果可行。


2
我在.lessfilter中使用javap来查看类文件,以便直接反编译并知道它们是用哪个版本编译的。
*.class)
echo "/** "
javap -verbose "$1" | grep version | sed -e 's/50/Java6/' -e 's/51/Java7/' -e 's/52/Java8/' -e 's/53/Java9/' -e 's/54/Java10/' -e 's/55/Java11/' -e 's/56/Java12/' -e 's/57/Java13/'
echo " **/"
java -jar ~/bin/cfr-0.150.jar "$1" | enscript --color --language=ansi --highlight=java -o - -q
;;

(尝试添加到之前答案的评论中,但无法格式化代码,并认为这对其他人可能有用)


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