You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8升级Java17后Spring Boot项目出现LoadTimeWeaver错误

问题与解决方案

问题概述

将Java项目(java11分支)从Java8升级至17后,修改安全、ACL及EHCache相关代码可编译,但运行时抛出BeanCreationException,提示无法应用类转换器,未指定LoadTimeWeaver;尝试添加@EnableLoadTimeWeaving注解并引入AspectJ依赖后,出现模块权限错误InaccessibleObjectException,提示java.base模块未向未命名模块开放java.lang包。

LoadTimeWeaving(LTW)说明

LTW是Spring在类加载阶段动态修改字节码的机制,常用于JPA懒加载增强、AspectJ切面织入、缓存方法增强等。你未主动配置但触发该问题,大概率是升级后Spring6/Boot3的默认行为变化,或依赖组件(如JPA、EHCache)自动启用了LTW。

方案1:停用LoadTimeWeaving

优先尝试停用,因为你未主动配置,可能业务不需要该机制:

  • 禁用JPA织入:在application.properties或application.yml中添加配置:
    spring.jpa.weaving=false
    
    这是最常见的触发原因,JPA默认会启用字节码增强实现懒加载,禁用后会改用Spring代理实现。
  • 排除Spring自动配置:在主类的@SpringBootApplication注解中排除LTW自动配置类:
    @SpringBootApplication(exclude = LoadTimeWeaverAutoConfiguration.class)
    public class EChempadApplication {
        // ...
    }
    
  • 检查EHCache配置:若使用EHCache3+,确认是否启用了字节码增强,改用声明式缓存配置(如Spring Cache注解)替代字节码增强模式。

方案2:正确配置LoadTimeWeaving(若必须启用)

如果业务依赖LTW(如使用AspectJ原生切面),需解决模块权限并正确配置:

  • 添加Java模块权限参数:在应用启动参数中加入:
    --add-opens java.lang/java.lang.ClassLoader=ALL-UNNAMED
    
    解除Java17模块系统对ClassLoader反射访问的限制。
  • 引入适配的AspectJ依赖:确保使用适配Spring6和Java17的AspectJ版本(如1.9.20+),Maven依赖示例:
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.20.1</version>
        <scope>runtime</scope>
    </dependency>
    
  • 配置LoadTimeWeaver并添加JavaAgent:
    1. 创建配置类:
      @Configuration
      @EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.AUTODETECT)
      public class LtwConfig {
          @Bean
          public LoadTimeWeaver loadTimeWeaver() {
              return new InstrumentationLoadTimeWeaver();
          }
      }
      
    2. 启动时添加AspectJ Agent参数:
      -javaagent:/path/to/aspectjweaver-1.9.20.1.jar
      
      (替换为本地依赖的实际路径,Maven项目可从本地仓库获取)

LTW对应用的影响

  • 启用时:支持更灵活的字节码增强,如AspectJ全量切面、JPA无代理懒加载等,但需额外启动参数,Java9+下需处理模块权限,增加配置复杂度。
  • 停用后:若由JPA触发,懒加载会改用Spring动态代理(需实体类非final或开放代理访问);若依赖AspectJ,需改用Spring AOP(仅支持方法级切面,基于接口或CGLIB代理),Spring AOP无需LTW,适配Java17更简单。

你之前操作的问题

添加@EnableLoadTimeWeaving但未配置AspectJ JavaAgent和模块权限参数,导致Java17模块系统阻止了对ClassLoader的反射访问,从而抛出InaccessibleObjectException。

内容的提问来源于stack exchange,提问作者Aleix Mariné

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:47:52