Gradle多模块项目中AspectJ跨模块织入失效问题求助
问题解决:Gradle多模块/外部项目中AspectJ切面跨模块不生效
首先要纠正一个关键的切点表达式错误:你的@MyAnnotation是类级别注解(@Target(ElementType.TYPE)),但当前切面使用的@annotation(MyAnnotation)只会匹配方法上标注该注解的场景,完全无法触发类上的注解匹配。需要将切点修改为@within(MyAnnotation)(建议写全注解的包路径,避免歧义):
@Aspect public class MyAnnotationAspect { // 匹配类上带有MyAnnotation的所有方法 @Before(value = "@within(com.yourpackage.MyAnnotation)") public void myPointCut(JoinPoint joinPoint) { // ... } }
接下来解决跨模块织入的核心问题:当前配置仅让切面模块内部的测试代码完成织入,其他模块/外部项目使用时,切面没有被注入到目标类的编译过程中,需要按以下步骤调整配置:
1. 调整切面模块的build.gradle
确保切面模块能作为合格的依赖库,向外暴露必要的AspectJ依赖和切面类:
plugins { id "io.freefair.aspectj.post-compile-weaving" version "8.0.1" id 'java-library' // 作为依赖库,推荐使用java-library插件 } dependencies { // 用api替代implementation,让依赖该模块的项目能继承AspectJ依赖 api 'org.aspectj:aspectjrt:1.9.19' api 'org.aspectj:aspectjweaver:1.9.19' implementation "org.assertj:assertj-core:${assertJVersion}" } // 确保切面类被正确导出,供外部模块织入 tasks.withType(org.gradle.api.tasks.compile.JavaCompile) { if (it.name == 'compileJava') { ajc.options.aspectpath.from sourceSets.main.output } }
2. 项目内其他模块的配置
对于依赖切面模块的内部模块,需要启用AspectJ编译后织入,并将切面模块加入到aspectpath中:
plugins { id "io.freefair.aspectj.post-compile-weaving" version "8.0.1" } dependencies { // 依赖切面模块 implementation project(':你的切面模块名称') // 将切面模块加入aspectpath,编译时自动完成切面织入 aspectpath project(':你的切面模块名称') }
3. 外部项目引入切面模块的配置
如果将切面模块发布到Maven仓库,外部项目引入时,同样需要启用AspectJ织入并配置aspectpath:
plugins { id "io.freefair.aspectj.post-compile-weaving" version "8.0.1" } dependencies { implementation '你的groupId:切面模块artifactId:版本号' aspectpath '你的groupId:切面模块artifactId:版本号' }
内容的提问来源于stack exchange,提问作者rcgeorge23
相关产品推荐
相关产品推荐

