如何解决 java.lang.UnsupportedClassVersionError 错误?我在哪里可以找到正确的 JRE 版本?

How to solve java.lang.UnsupportedClassVersionError error? Where can I found the right JRE version?

我正在开发一个 Java 应用程序(一个 Spring 启动应用程序)。在我的 Ubuntu 开发机器上,我使用了这个 JDK 版本:

andrea@ubuntu:~$ java --version
java 17 2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)

这是我的 Spring 引导应用程序的 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.notariato</groupId>
    <artifactId>UpdateInfoBatch</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>UpdateInfoBatch</name>
    <description>Recupera ed aggiorna le informazioni relative alla lista dei notai ed ai distretti notarili</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        
        <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    

    
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        
        
        
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.4.3</version>
        </dependency>
        
    
    
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我获得了 .jar 应用程序,在我的开发机器上没有问题 运行。

当我尝试在生产机器上移动此 .jar 文件时出现问题。

此处的Java版本如下:

webadmin@webadmin.spaccount.it [~/java/jre1.8.0_311/bin]# ./java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
webadmin@webadmin.spaccount.it [~/java/jre1.8.0_311/bin]#

因此,如您所见,这里的 JAVA 版本似乎是 1.8。0_311

运行 我的应用程序 我收到了这条错误消息:

webadmin@webadmin.spaccount.it [~/java/jre1.8.0_311/bin]# ./java -jar /home/webadmin/notartel-import-data-batch/UpdateInfoBatch-0.0.1-SNAPSHOT.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/notariato/updateInfo/UpdateInfoBatchApplication 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(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
        at java.net.URLClassLoader.access0(URLClassLoader.java:74)
        at java.net.URLClassLoader.run(URLClassLoader.java:369)
        at java.net.URLClassLoader.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

看来安装的JRE太旧了。我试图手动下载 JAVA 17 的 JRE 包,但我找不到它。

我要使用哪个版本的 JRE?我在哪里可以下载这个 JRE 包版本? (不使用 yum 包管理器,我需要下载包含 JRE 的 tar 文件,然后将其解压缩到我的系统上)。

谢谢

自 Java9 以来,传统的 JRE 不再存在(尽管一些供应商提供类似 JRE 的包)。为了获得 Java 运行 时间到 运行 您的应用程序,您可以使用 jlink 工具,它也与 JDK 17 一起提供,就像这样模块化应用:

jlink -p <directory app jar> --add-modules <name of your module> --output custom_runtime

如果您的应用程序是 非模块化的,您将必须找出您需要哪些模块,例如使用 jdeps(也是 JDK17):

$ mvn dependency:build-classpath -DincludeScope=runtime -Dmdep.outputFile=cp.txt
$ jdeps -classpath "<contents of cp.txt>" --multi-release 17 --print-module-deps --ignore-missing-deps <app jar>

打印类似 mod1,mod2,mod3 的内容。将它们传递给 --add-modules 标志:

jlink --add-modules mod1,mod2,mod3 --output custom_runtime

这将生成一个 custom_runtime 文件夹,其中包含 Java 运行 您可以用来 运行 您的应用程序的时间,然后可以将其部署到目标机器上。

如果您的应用 非模块化 您还必须部署应用 .jar 文件及其所有依赖项(不应有外部 运行Spring 引导项目的时间依赖项,因为它将所有依赖项捆绑在应用程序 jar 中)。然后,在自定义 运行 时间使用 java 可执行文件到 运行 应用程序:

/path/to/custom/runtime/java -jar <app jar>