问题描述
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/xxx/Main has been compiled by a more recent version of the Java Runtime (class file version 61.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 org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
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)
报错如上,也是一个老生常谈的问题了
更高版本的 JDK 编译,使用jdk16编译,但运行时使用的 JRE 或 JDK 版本较低。具体来说:
错误原因:
class file version 60.0 是 JDK 16 的字节码版本。
而你的运行环境只支持到 class file version 52.0(JDK 8)。
45:JDK 1.1
46:JDK 1.2
47:JDK 1.3
48:JDK 1.4
49:JDK 5
50:JDK 6
51:JDK 7
52:JDK 8
53:JDK 9
54:JDK 10
55:JDK 11
56:JDK 12
57:JDK 13
58:JDK 14
59:JDK 15
60:JDK 16
61:JDK 17
排查
1、检查运行的java版本
java -version
没错
2、查看环境变量,并移动到最上面
3、检查maven的配置
<build>
<finalName>service</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
spring-boot-maven-plugin是Spring Boot官方提供的Maven插件,用于将Spring Boot应用程序打包成可执行的JAR文件
maven-compiler-plugin 是用于在编译(compile)阶段加入定制化参数,而 spring-boot-maven-plugin 是用于 spring boot 项目的打包(package)阶段,两者没什么关系
比如可以指定编译使用的jdk版本
<source>17</source>
:指定使用 JDK 17 来编译源代码。这意味着你的源代码是按照 JDK 17 的语法特性来编译的。<target>17</target>
:指定编译后的字节码版本为 JDK 17。这样生成的.class
文件只能在 JDK 17 或更高版本的 Java 运行时环境中运行。
4、
where java
发现有多个,但是jdk17是排在前面,为了防止运行时使用其他的,我去环境变量中删除了其他的jdk,但是还是不行,说明跟这个没关系。
echo %PATH%
// 输出环境变量,看jdk17是否在前面
5、验证 JAR 中的编译字节码版本,确保与运行时版本匹配:
// 解压jar包
jar xf service.jar
// 检查 Main.class 的字节码版本
javap -verbose BOOT-INF/classes/com/xxx/Main.class | findstr "major version"
的输出显示 major version: 61
,表示 Main.class
文件是用 JDK 17 编译的
minor version: 0
通常与major version
配合使用,0
表示这是 JDK 的标准编译版本。major version: 61
和minor version: 0
表明Main.class
是用 JDK 17 编译的
6、实在不行,最简单的就是到控制面板中把jdk8卸载,只留jdk17