如何解决 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>
我正在开发一个 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>