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

Spring Boot集成AspectJ LTW启动报错求助

解决Spring Boot集成AspectJ LTW的类加载器报错问题

核心问题分析

  1. 「Illegal access: this web application instance has been stopped already」报错:源于Tomcat类加载器生命周期冲突,spring.factories加载时应用上下文已处于异常终止状态。
  2. 「ClassLoader不支持addTransformer方法」报错:自定义的TomcatInstrumentableClassLoader未正确生效,默认Tomcat类加载器不支持字节码转换操作。

具体修复步骤

1. 修正依赖配置

确保AspectJ与Spring Boot依赖版本匹配(以Spring Boot 2.x为例):

<dependencies>
    <!-- Spring AOP基础依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>
    <!-- AspectJ LTW核心织入器 -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>
    <!-- Spring Boot Tomcat集成包(确保引入) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

2. 强制替换Tomcat类加载器

通过TomcatServletWebServerFactory自定义类加载器,确保Tomcat启动时使用TomcatInstrumentableClassLoader:

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader;

@Configuration
public class TomcatClassLoaderConfig {

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> customTomcatClassLoader() {
        return factory -> {
            factory.setTomcatContextCustomizer(context -> {
                // 替换默认类加载器为支持字节码转换的实现
                context.setClassLoader(new TomcatInstrumentableClassLoader(context.getParentClassLoader()));
            });
        };
    }
}

3. 配置LoadTimeWeaver并启用LTW

创建Spring配置类,绑定TomcatLoadTimeWeaver并显式启用AspectJ织入:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableLoadTimeWeaving;
import org.springframework.context.annotation.LoadTimeWeavingConfigurer;
import org.springframework.instrument.classloading.LoadTimeWeaver;
import org.springframework.instrument.classloading.tomcat.TomcatLoadTimeWeaver;

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
public class AspectJLTWConfig implements LoadTimeWeavingConfigurer {

    @Override
    public LoadTimeWeaver getLoadTimeWeaver() {
        // 关联Tomcat类加载器的织入实现
        return new TomcatLoadTimeWeaver();
    }
}

4. 定义AspectJ织入规则

在src/main/resources/META-INF下创建aop.xml,指定需要织入的切面和目标类范围:

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN">
<aspectj>
    <weaver options="-verbose -showWeaveInfo">
        <!-- 替换为你的业务包路径 -->
        <include within="com.yourbiz..*"/>
    </weaver>
    <aspects>
        <!-- 替换为你的切面类全限定名 -->
        <aspect name="com.yourbiz.aspect.BusinessLogAspect"/>
    </aspects>
</aspectj>

5. 解决spring.factories加载异常

添加JVM启动参数,确保AspectJ织入器在Tomcat类加载器初始化前生效:

-javaagent:/path/to/aspectjweaver-{your-version}.jar

注:替换{your-version}为实际依赖版本,IDEA可在「Run Configuration」的VM options中配置该参数

验证修复

  1. 启动应用后检查日志,确认TomcatInstrumentableClassLoader被加载,无addTransformer相关异常。
  2. 触发目标业务方法,验证切面逻辑(如日志、权限校验)是否正常执行。

内容的提问来源于stack exchange,提问作者Arvind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:48:09