Spring Boot 3配置AspectJ LTW遇NoSuchMethodError问题求助
Spring Boot AspectJ 加载时织入(LTW)配置错误排查与修正
问题背景
在Spring Boot项目中配置AspectJ LTW,目标是拦截类路径下所有方法(包括非Spring Bean)做执行时间监控,但测试时抛出错误:java.lang.NoSuchMethodError: 'LoadTimeWeavingAspect.aspectOf()'
当前配置
1. 配置类
@Configuration @EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) public class AspectJWeaverConfiguration {}
2. META-INF/aop.xml
<aspectj> <aspects> <aspect name="project.base.package.performance_monitor.LoadTimeWeavingAspect"/> </aspects> <weaver options="-verbose -showWeaveInfo"> <include within="project.base.package..*"/> </weaver> </aspectj>
3. Aspect类
@Aspect public class LoadTimeWeavingAspect { @Around("within(project.base.package..*)") public Object around(final ProceedingJoinPoint pjp) throws Throwable { Method method = ((MethodSignature) pjp.getSignature()).getMethod(); PerformanceWatcher.start(method.getDeclaringClass().getName() + "." + method.getName()); try { return pjp.proceed(); } finally { PerformanceWatcher.stop(); } } }
4. pom.xml依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument</artifactId> <version>${spring-instrument.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-otel</artifactId> <version>${micrometer-tracing.version}</version> </dependency> </dependencies>
5. Java Agent参数
-javaagent:"C:\Users\user\.m2\repository\org\springframework\spring-instrument\6.2.8\spring-instrument-6.2.8.jar"
错误原因与修正方案
核心原因
aspectOf()是AspectJ编译器为@Aspect类自动生成的单例访问方法,出现该错误说明你的Aspect类未被AspectJ编译器编译处理,导致Spring LTW无法获取Aspect实例。
具体修正步骤
添加AspectJ编译依赖与插件
在pom.xml中补充AspectJ runtime、编译器依赖,并配置Maven插件使用AspectJ编译器处理代码:<dependencies> <!-- 新增AspectJ核心依赖 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.22.1</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.22.1</version> </dependency> <!-- 保留原有依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument</artifactId> <version>${spring-instrument.version}</version> </dependency> <!-- 其他依赖... --> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <configuration> <source>17</source> <!-- 匹配你的项目JDK版本 --> <target>17</target> </configuration> </plugin> <!-- 配置AspectJ编译插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.15.0</version> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <source>17</source> <target>17</target> <complianceLevel>17</complianceLevel> <aspectLibraries> <aspectLibrary> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </aspectLibrary> </aspectLibraries> <forceAjcCompile>true</forceAjcCompile> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.9.22.1</version> </dependency> </dependencies> </plugin> </plugins> </build>优化LTW配置(可选)
若不需要Spring上下文管理Aspect实例,可移除@EnableLoadTimeWeaving配置类,直接通过aop.xml和Java Agent完成纯AspectJ LTW配置,更适配非Spring Bean拦截需求。确认Java Agent有效性
- 确保
spring-instrument.jar版本与Spring Boot版本匹配(当前版本一致无问题) - 测试运行时必须正确传递Java Agent参数,保证JVM启动时加载该Agent
- 确保
验证编译结果
编译后通过反编译工具查看LoadTimeWeavingAspect.class,确认是否包含aspectOf()及ajc$around$...等AspectJ生成的方法。
验证方式
启动应用时查看控制台,若aop.xml配置了-verbose -showWeaveInfo,应看到类似织入日志:
[AspectJ Weaver] info: Join point 'method-execution(xxx)' in Type 'xxx' (xxx.java:xx) advised by around advice from 'LoadTimeWeavingAspect' (LoadTimeWeavingAspect.class)
内容的提问来源于stack exchange,提问作者Daniel Gimenez
相关产品推荐
相关产品推荐

