问题描述
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.0at 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