spring中 asm 和 jdk版本不兼容的问题

本文记录了在使用Spring 3.2版本时遇到的与JDK 1.8版本不兼容的问题,详细展示了错误堆栈跟踪,并提供了两种解决方案:升级到Spring 4.0或以上版本,或降级JDK版本。

前言:

  最近在学 spring,做相关demo测试时遇到一个问题

报错信息

  1. java.lang.IllegalArgumentException
  2. at org.springframework.asm.ClassReader.<init>(Unknown Source)
  3. at org.springframework.asm.ClassReader.<init>(Unknown Source)
  4. at org.springframework.asm.ClassReader.<init>(Unknown Source)
  5. at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
  6. at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
  7. at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
  8. at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
  9. at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
  10. at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
  11. at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
  12. at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
  13. at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
  14. at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
  15. at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
  16. at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
  17. at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
  18. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
  19. at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
  20. at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
  21. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  22. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  23. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  24. at java.lang.reflect.Method.invoke(Unknown Source)
  25. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
  26. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  27. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
  28. at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  29. at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
  30. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
  31. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
  32. at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
  33. at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
  34. at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
  35. at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
  36. at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
  37. at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
  38. at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  39. at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  40. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  41. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  42. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  43. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

出错原因

  jdk版本不兼容,我用的是spring 3.2的版本,而 jdk的版本是 1.8

解决方法

  •   第一种:使用spring 4.0以上版本。
  •   第二种:使用jdk 1.7或以下版本

--------------------------------------------------MyEclipse 更改 jdk 版本分割线--------------------------------------------------------------------------------------

 

Window-->Preference-->java-->Installed JREs-->add-->Standard VM-->在JRE home中选择 JDK 的安装目录(注意:是 JDK 的安装目录

转载于:https://www.cnblogs.com/harryper/p/6852793.html

### 3.1 检查Spring项目对JDK 17的兼容性方法 要判断一个Spring项目是否兼容JDK 17,需从多个维度综合评估,包括Spring框架版本、依赖库的支持情况、编译器配置以及运行时环境。 #### 3.1.1 确认Spring Boot版本JDK 17的匹配关系 Spring Boot官方明确指出不同版本JDK的支持范围。例如: - **Spring Boot 2.5.x**:支持至JDK 16,不推荐用于JDK 17。 - **Spring Boot 2.6.x / 2.7.x**:正式支持JDK 17[^2]。 - **Spring Boot 3.0+**:专为JDK 17及以上设计,基于Jakarta EE 9规范,包名由`javax.*`改为`jakarta.*`。 可通过`pom.xml`或`build.gradle`文件中定义的Spring Boot版本号进行确认: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.12</version> </parent> ``` #### 3.1.2 验证Spring Framework核心依赖版本 Spring Boot 2.6及更高版本通常默认使用Spring Framework 5.3.x,该系列已全面支持JDK 17。可通过Maven命令查看实际解析的Spring Framework版本: ```bash mvn dependency:tree | grep "spring-context" ``` 若输出类似如下内容,则表示使用的是兼容版本: ``` [INFO] +- org.springframework:spring-context:jar:5.3.20.RELEASE ``` #### 3.1.3 检查第三方库是否兼容JDK 17 部分旧版第三方库(如Hibernate 5、MyBatis 3.4等)可能未适配JDK 17,导致类加载失败或运行时异常。可借助工具如`jdeps`分析项目依赖是否包含不兼容模块: ```bash jdeps --jdk-internals target/classes/*.class ``` 此外,检查是否有直接引入ASM、CGLIB等字节码操作库的版本过低。建议将ASM升级至9.2以上以避免类解析错误[^2]。 #### 3.1.4 启用JDK 17特性并测试启动日志 在完成上述版本确认后,切换JDK至17并尝试启动应用。观察日志中是否出现以下异常: - `java.lang.IllegalArgumentException: Unsupported class file major version 61` - `java.lang.NoClassDefFoundError: javax/servlet/ServletContext` 前者说明ASMSpring版本过低;后者则表明存在未迁移到Jakarta EE 9的组件,需替换相关依赖为`jakarta.*`前缀[^1]。 #### 3.1.5 使用Spring Boot Actuator验证运行状态 部署并启动应用后,访问Spring Boot Actuator的健康检查接口,确保系统整体处于正常状态: ```bash GET http://localhost:8080/actuator/health ``` 返回内容应为: ```json { "status": "UP" } ``` 若返回错误或服务无法启动,则需进一步排查具体异常堆栈。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值