Java1.8 换版本为 openjdk17 后 springboot 程序跑不起来,求助~~~

2022-03-01 16:46:36 +08:00
 summerlv

本来使用的是 oracle jdk1.8 跑的 springboot 2.3.0 程序,但是后面要求换为 openjdk17 ,这样一换后 springboot 跑不起来了。请问大家有遇到过换 java 版本的问题吗? 报错如下:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\MIPS\MIPSAuth\mips-api\target\classes\com\mips\cloud\MipsApiApplication.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [D:\MIPS\MIPSAuth\mips-api\target\classes\com\mips\cloud\MipsApiApplication.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 61
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:452) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:315) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.0.RELEASE.jar:2.3.0.RELEASE]
    at com.mips.cloud.MipsApiApplication.main(MipsApiApplication.java:12) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.3.0.RELEASE.jar:2.3.0.RELEASE]
Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [D:\MIPS\MIPSAuth\mips-api\target\classes\com\mips\cloud\MipsApiApplication.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 61
    at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:60) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:49) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:429) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    ... 26 common frames omitted
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 61
    at org.springframework.asm.ClassReader.<init>(ClassReader.java:196) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.asm.ClassReader.<init>(ClassReader.java:177) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.asm.ClassReader.<init>(ClassReader.java:163) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.asm.ClassReader.<init>(ClassReader.java:284) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:57) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    ... 30 common frames omitted
 
 
Process finished with exit code 0
2501 次点击
所在节点    问与答
13 条回复
Jooooooooo
2022-03-01 16:47:31 +08:00
报错信息不是很清晰吗: Unsupported class file major version 61, 这说的就是 jdk 的版本.
fanchenio
2022-03-01 16:51:16 +08:00
你确定是用 jdk17 跑的么,上面提示说了不支持类文件主版本 61 ,也就是不支持 JDK17 ,怀疑是你启动项目时用错的 JDK ?没有切换到 JDK17 ?
raptium
2022-03-01 16:52:45 +08:00
应该是 Spring Boot 版本太低了。我还没有写过 Java 17 的 Spring Boot 项目,不过搜到一篇这个 https://blog.codecentric.de/en/2021/12/migrating-spring-boot-java-17/
summerlv
2022-03-01 16:55:14 +08:00
我看了下 idea 中的 Project Structure 啊,是 17 版本,而且确认了每个 module 的 Sources 和 Dependences 都是 17 的
fanchenio
2022-03-01 17:07:09 +08:00
楼主去这个网址看一下: https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/html/getting-started.html#getting-started ,这个是 SpringBoot2.3.x 版本文档,里面写了。

Spring Boot 2.3.12.RELEASE requires Java 8 and is compatible up to Java 15 (included).

好像只支持 JDK8~15 ?
sagaxu
2022-03-01 17:13:01 +08:00
8 到 17 步子太大,建议先 8 到 11 ,使用一段时间确认没有问题后,再 11 到 17
potatowish
2022-03-01 17:20:31 +08:00
SpringBoot2.6 开始才支持 JDK17
echo1937
2022-03-01 18:02:50 +08:00
@potatowish 好像是 2.5.5 就开始支持了,springboot initializer 就可以建出来了。
echo1937
2022-03-01 18:05:57 +08:00
Spring Boot 2.5.5 requires Java 8 and is compatible up to and including Java 17. Spring Framework 5.3.10 or above is also required.

Spring Boot 2.5.4 requires Java 8 and is compatible up to and including Java 16. Spring Framework 5.3.9 or above is also required.
night98
2022-03-01 22:54:28 +08:00
maven xml 编译目标修改为 jdk17 ,然后 idea - maven 设置里面也是一样,跑起来应该没啥问题,估计会有点 bug 啥的
summerlv
2022-03-02 08:44:35 +08:00
@raptium 这个问题目前解决了,就是 springboot 版本和 jdk 版本的问题,我将 springboot 版本升级到了 2.5.7 ,然后 springcloud 版本根据和 springboot 的对应关系升级为:2020.0.5 项目可以跑起来了。参考: https://blog.codecentric.de/en/2021/12/migrating-spring-boot-java-17/
另外就是还要注意出现的一系列的其他包版本依赖问题。
谢谢~

但是目前项目有个问题。由于升级到了 jdk17 后,我的一个用于认证的微服务跑不起来了,其他微服务可以跑起来。感觉是和
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
<version>2.2.5.RELEASE</version>
这个依赖有关,我看了下这个依赖会依赖一个叫 javax.xml.bind:jaxb-api:2.3.1 的依赖。

然后我运行起来的报错主要是:Caused by: java.lang.NoSuchMethodException: Caused by:
java.lang.NoSuchMethodException: sun.misc.Unsafe.defineClass(java.lang.String,[B,int,int,java.lang.ClassLoader,java.security.ProtectionDomain)
at java.base/java.lang.Class.getMethod(Class.java:2227) ~[na:na]
at com.sun.xml.bind.v2.runtime.reflect.opt.Injector$3.run(Injector.java:201) ~[jaxb-impl-2.3.0.1.jar:2.3.0.1]
at com.sun.xml.bind.v2.runtime.reflect.opt.Injector$3.run(Injector.java:197) ~[jaxb-impl-2.3.0.1.jar:2.3.0.1]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) ~[na:na]
... 74 common frames omitted

我搜了下这种类型的问题是说包冲突啥的,我也没看明白:
https://stackoverflow.com/questions/69637244/java-lang-nosuchmethodexception-sun-misc-unsafe-defineclassjava-lang-string-b

https://github.com/mojohaus/jaxb2-maven-plugin/issues/182

https://shiligui.blog.csdn.net/article/details/117125213

目前我的环境是都调为了 17:

<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
summerlv
2022-03-02 08:50:28 +08:00
报错如下:

java.security.PrivilegedActionException: null
at java.base/java.security.AccessController.doPrivileged(AccessController.java:573) ~[na:na]
at com.sun.xml.bind.v2.runtime.reflect.opt.Injector.<clinit>(Injector.java:197) ~[jaxb-impl-2.3.0.1.jar:2.3.0.1]


Caused by: java.lang.NoSuchMethodException: sun.misc.Unsafe.defineClass(java.lang.String,[B,int,int,java.lang.ClassLoader,java.security.ProtectionDomain)
at java.base/java.lang.Class.getMethod(Class.java:2227) ~[na:na]
at com.sun.xml.bind.v2.runtime.reflect.opt.Injector$3.run(Injector.java:201) ~[jaxb-impl-2.3.0.1.jar:2.3.0.1]
at com.sun.xml.bind.v2.runtime.reflect.opt.Injector$3.run(Injector.java:197) ~[jaxb-impl-2.3.0.1.jar:2.3.0.1]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) ~[na:na]
... 74 common frames omitted
summerlv
2022-03-02 10:19:16 +08:00
目前解决了 auth 启动不了的问题

添加了依赖:

<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>

然后运行起来连接数据库的时候出现了问题,搜了下是 druid 数据库连接池的问题,由 1.2.8 改成了 1.2.5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<!-- <version>1.2.8</version>-->
<!--
SqlServer driver validateConnection false #4451
https://github.com/alibaba/druid/issues/4451 -->
<version>1.2.5</version>
</dependency>


这次升级总算是完成了,真累啊~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/837218

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX