Gradle中AspectJ Post-Compile Weaving无法作用于测试代码的问题求助
解决Gradle AspectJ编译后织入不生效于Test源码集类的问题
我明白你遇到的问题:用Gradle 7.4搭配io.freefair.aspectj.post-compile-weaving插件时,src/main/java里的类能被正常切面增强,但src/test/java里的静态内部类却没被织入。这其实是因为插件默认只对main源码集启用编译后织入,test源码集的编译流程并没有自动应用AspectJ织入逻辑。
下面是具体的解决方案:
1. 调整Gradle配置,让Test源码集也启用AspectJ织入
你需要修改build.gradle(或build.gradle.kts),显式配置插件对test源码集进行编译后织入,并将main源码集的输出(包含你的切面类)加入到test的切面路径中。
Groovy DSL(build.gradle)
plugins { id 'java' // 注意版本匹配:Gradle 7.4对应Freefair 6.x版本,这里用6.6.3做示例 id 'io.freefair.aspectj.post-compile-weaving' version '6.6.3' } aspectj { sourceSets { // 为test源码集配置AspectJ织入 test { // 将main源码集的输出(含切面类)添加到test的切面路径 aspectPath.from sourceSets.main.output } } } dependencies { // 确保AspectJ运行时在test环境可用 testImplementation 'org.aspectj:aspectjrt:1.9.9.1' // 引入AspectJ织入器依赖 aspect 'org.aspectj:aspectjweaver:1.9.9.1' }
Kotlin DSL(build.gradle.kts)
plugins { java id("io.freefair.aspectj.post-compile-weaving") version "6.6.3" } aspectj { sourceSets { named("test") { aspectPath.from(sourceSets.main.get().output) } } } dependencies { testImplementation("org.aspectj:aspectjrt:1.9.9.1") aspect("org.aspectj:aspectjweaver:1.9.9.1") }
2. 配置说明
- 为什么要添加
aspectPath?:test源码集的织入过程需要找到你的切面类(位于main源码集的输出中),所以必须将main的classpath加入到test的切面路径里,否则织入器找不到切面,无法完成增强。 - 版本兼容性:Gradle 7.4需要搭配Freefair插件的6.x版本(不要用7.x,7.x对应Gradle 8+),AspectJ的版本也要和插件版本兼容,这里用1.9.9.1是经过验证的组合。
3. 验证效果
修改配置后,重新运行你的测试:
./gradlew test
此时instantiateWovenClassInTest方法执行时,应该能正常输出切面的通知信息,和main源码集的类表现一致。
补充:和LTW的区别
你之前用Load Time Weaving(LTW)能生效,是因为LTW是在类加载阶段动态织入,test类加载时会被LTW代理处理;而Post-compile Weaving(PCW)是在编译阶段完成织入,必须显式告诉Gradle要对哪些源码集执行PCW流程,这就是为什么默认情况下test类没被处理的原因。
内容的提问来源于stack exchange,提问作者avenue68
相关产品推荐
相关产品推荐

