如何修复java.lang.UnsupportedClassVersionError

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:

     srcset=

    现在,让我们选择Alternate JRE并指向我们的Java 11安装:

     srcset=

    此时,我们的应用程序将针对Java 11运行。

    4.2。 更改编译器级别

    现在让我们看一下如何将目标更改为较低级别的Java。

    首先,让我们回到Project属性,然后回到Java Compiler,并选中Enable project specific settings:

     srcset=

    在这里,我们可以将项目设置为针对Java的早期版本进行编译,并自定义其他合规性设置:

     srcset=

    5. IntelliJ IDEA

    我们还可以控制在IntelliJ IDEA中用于编译和运行的Java版本。

    5.1。 添加一个JDK

    在此之前,我们将了解如何添加其他JDK。 让我们转到文件->项目结构->平台设置-> SDK:

     srcset=

    让我们单击中间列中的加号图标,从下拉列表中选择JDK,然后选择我们的JDK位置:

     srcset=

    5.2。 更改JRE

    首先,我们将研究如何使用IDEA在较新的JRE上运行我们的项目。

    让我们转到运行->编辑配置…,并将我们的JRE更改为11:

     srcset=

    现在,当我们运行项目时,它将与Java 11 JRE一起运行。

    5.3。 更改编译器级别

    如果要分发应用程序以使其在较低的JRE上运行,则需要调整编译器级别以针对Java的较早版本。

    让我们转到文件->项目结构…->项目设置->项目,然后更改我们的Project SDK和项目语言级别:

     srcset=

    现在我们可以构建项目,并且生成的类文件将在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版本错误消息,以及如何修复它。