我在另一篇文章中看到了Java的主要版本号列表:

Java Major version
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

这个列表从何而来?有具体的参考吗?最好还能显示小版本?


当前回答

我在类的.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
;;

(试图作为注释添加到之前的答案,但无法获得格式化的代码,并认为这可能对其他人有用)

其他回答

如果你在build/com/foo/Hello.class上有一个类文件,你可以使用下面的命令检查它的java版本:

javap -v <path to class file> | grep "major"

使用示例:

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

根据OP中的表,主版本57意味着类文件被编译到JDK 13字节码级别

这些来自于类版本。如果你试图在java 5运行时加载一些java 6编译的东西,你会得到错误,不兼容的类版本,得到50,预期49。或者类似的东西。

更多信息请参见这里的字节偏移量7。

更多信息也可以在这里找到。

我在类的.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
;;

(试图作为注释添加到之前的答案,但无法获得格式化的代码,并认为这可能对其他人有用)

主要版本号的正式来源:

Java SE 19虚拟机规范,第4章。文件格式类

JVM规范的最新发布版本可以在这里找到。

(实际上是一个扩展的评论而不是一个回答..)

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

这个问题在这个响应中得到了回答,它引用了JAVA SE规范中的“类文件格式”。似乎这是相当权威的(它也在Wiki中引用字节6(主要版本)值),应该是可接受的答案。


有几个答案似乎集中在如何使用javap确定值或不使用它。这些应该是独立的问题。然而,一种非javap查找版本的方法是unix命令文件。文件读取魔法,在ClassFile结构中指定。

ie: file myClass.class,或者更优雅地,file -b myClass.class | awk -F',' '{print $NF}'

eg:

$ 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)