How to Fix java.lang.UnsupportedClassVersionError
1.简介
在这个简短的教程中,我们将学习导致Java运行时错误java.lang.UnsupportedClassVersionError:不支持的major.minor版本及其修复方法的原因。
进一步阅读:
找不到或加载主类错误
Java编译器错误:"期望类,接口或枚举"
java.lang.VerifyError的原因与避免
2.看一下错误
让我们从一个示例错误开始:
1 2 3 | Exception in thread"main" java.lang.UnsupportedClassVersionError: com/baeldung/MajorMinorApp 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 |
该错误告诉我们,我们的类是在比尝试运行它的版本更高的Java版本下编译的。 更具体地说,在这种情况下,我们使用Java 11编译了我们的类,并尝试使用Java 8运行它。
2.1。 Java版本号
作为参考,让我们快速看一下Java版本号。 如果我们需要下载适当的Java版本,这将很方便。
主版本号和次版本号存储在类字节码中的字节六和七中。
让我们看看主要版本号如何映射到Java版本:
45 = Java 1.1
46 = Java 1.2
47 = Java 1.3
48 = Java 1.4
49 = Java 5
50 = Java 6
51 = Java 7
52 = Java 8
53 = Java 9
54 = Java 10
55 = Java 11
56 = Java 12
57 = Java 13
3.通过命令行修复
现在让我们讨论从命令行运行Java时如何解决此错误。
根据情况,我们有两种方法可以解决此错误:为较早版本的Java编译我们的代码,或在较新的Java版本上运行我们的代码。
最终决定取决于我们的情况。 如果我们需要使用已经在更高级别上进行编译的第三方库,则最好的选择可能是使用较新的Java版本运行我们的应用程序。 如果我们打包要分发的应用程序,则最好将其编译为较旧的版本。
3.1。 JAVA_HOME环境变量
让我们开始检查如何设置JAVA_HOME变量。 当我们从命令行运行javac时,这将告诉我们正在使用哪个JDK:
1 2 | echo %JAVA_HOME% C:\Apps\Java\jdk8-x64 |
如果我们准备完全迁移到较新的JDK,则可以下载较新的版本,并确保正确设置了PATH和JAVA_HOME环境变量。
3.2。 运行新的JRE
回到我们的示例,让我们看一下如何通过在更高版本的Java上运行该错误来解决该错误。 假设我们在C:Appsjdk-11.0.2中具有Java 11 JRE,则可以使用与其一起打包的java命令来运行代码:
1 2 | C:\Apps\jdk-11.0.2\bin\java com.baeldung.MajorMinorApp Hello World! |
3.3。 使用较旧的JDK进行编译
如果要编写要运行到特定Java版本的应用程序,则需要编译该版本的代码。
我们可以通过以下三种方式之一进行操作:使用较旧的JDK编译代码,使用javac命令的-bootclasspath,-source和-target选项(JDK 8和更早版本),或使用–release选项(JDK) 9及更高版本)。
让我们从使用较旧的JDK开始,类似于使用较新的JRE运行代码的方式:
1 | C:\Apps\Java\jdk1.8.0_31\bin\javac com/baeldung/MajorMinorApp.java |
可以仅使用-source和-target,但它仍可能会创建与旧版Java不兼容的类文件。
为了确保兼容性,我们可以将bootclasspath指向目标JRE的rt.jar:
1 2 3 | javac -bootclasspath"C:\Apps\Java\jdk1.8.0_31\jre\lib t.jar" \ -source 1.8 -target 1.8 com/baeldung/MajorMinorApp.java |
上面的内容主要适用于JDK 8及更低版本。 在JDK 9中,添加了–release参数来替换-source和-target。 –release选项支持目标6、7、8、9、10和11。
让我们使用–发布来定位Java 8:
1 | javac --release 8 com/baeldung/MajorMinorApp.java |
现在,我们可以在Java 8或更高版本的JRE上运行代码。
4. Eclipse IDE
现在,我们了解了错误以及纠正错误的一般方法,下面我们来学习一下,看看在Eclipse IDE中工作时如何应用它。
4.1。 更改JRE
假设我们已经为Eclipse配置了不同版本的Java,让我们更改项目的JRE。
让我们转到Project属性,然后转到Java Build Path,再到Libraries选项卡。 到达那里后,我们将选择JRE并单击Edit:
现在,让我们选择Alternate JRE并指向我们的Java 11安装:
此时,我们的应用程序将针对Java 11运行。
4.2。 更改编译器级别
现在让我们看一下如何将目标更改为较低级别的Java。
首先,让我们回到Project属性,然后回到Java Compiler,并选中Enable project specific settings:
在这里,我们可以将项目设置为针对Java的早期版本进行编译,并自定义其他合规性设置:
5. IntelliJ IDEA
我们还可以控制在IntelliJ IDEA中用于编译和运行的Java版本。
5.1。 添加一个JDK
在此之前,我们将了解如何添加其他JDK。 让我们转到文件->项目结构->平台设置-> SDK:
让我们单击中间列中的加号图标,从下拉列表中选择JDK,然后选择我们的JDK位置:
5.2。 更改JRE
首先,我们将研究如何使用IDEA在较新的JRE上运行我们的项目。
让我们转到运行->编辑配置…,并将我们的JRE更改为11:
现在,当我们运行项目时,它将与Java 11 JRE一起运行。
5.3。 更改编译器级别
如果要分发应用程序以使其在较低的JRE上运行,则需要调整编译器级别以针对Java的较早版本。
让我们转到文件->项目结构…->项目设置->项目,然后更改我们的Project SDK和项目语言级别:
现在我们可以构建项目,并且生成的类文件将在Java 8和更高版本上运行。
6.胃
在Maven中构建和打包文件时,我们可以控制目标Java版本。
使用Java 8或更早版本时,我们设置编译器插件的源和目标。
让我们使用编译器插件属性设置源和目标:
1 2 3 4 | <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties> |
另外,我们可以在编译器插件中设置源和目标:
1 2 3 4 5 6 7 8 9 | <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> |
使用Java 9中添加的–release选项,我们也可以使用Maven对其进行配置。
让我们使用一个编译器插件属性来设置发布:
1 2 3 | <properties> <maven.compiler.release>8</maven.compiler.release> </properties> |
或者我们可以直接配置编译器插件:
1 2 3 4 5 6 7 8 | <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <release>8</release> </configuration> </plugin> </plugins> |
7.结论
在这篇简短的文章中,我们了解了导致java.lang.UnsupportedClassVersionError的原因:不支持的major.minor版本错误消息,以及如何修复它。