JDK and JRE, java.lang.UnsupportedClassVersionError

今天我下载了jdk 11.0.1,一番配置后,运行简单的程序时时出现了java.lang.UnsupportedClassVersionError的错误,错误信息如下:

错误信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ajm@DESKTOP-R8SS06A MINGW64 /d/学习/cs61b
$ java HelloWorld
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

分析

由错误信息可以知道,是由于高版本的JDK(Java Development Kit),编译产生的.class文件在低版本的JRE(Java Runtime Environment) 无法运行而报错。JDK是用于java程序开发的工具包,包含javac编译器、jar打包工具等。JRE是能够让计算机运行java程序的软件包,比如java HelloWorld,执行HelloWorld程序。

查看JDK,JRE版本

1
2
3
4
5
6
7
8
9
ajm@DESKTOP-R8SS06A MINGW64 /d/学习/cs61b
$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

ajm@DESKTOP-R8SS06A MINGW64 /d/学习/cs61b
$ javac -version
javac 11.0.1

发现JRE是老的版本,于是我直接删除了这个老的版本。但是发现运行时出了问题:

1
2
3
ajm@DESKTOP-R8SS06A MINGW64 /d/学习/cs61b
$ java -version
bash: /c/Program Files (x86)/Common Files/Oracle/Java/javapath/java: No such file or directory

这是因为环境变量中的路径问题,直接在PATH中删除老版本java的路径,就能正确找到java 11.0.1这个版本。