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

Java+Gradle多模块项目外部模块Aspect失效问题求助

Gradle多模块AspectJ编译后织入配置方案

问题背景

Gradle构建的Java多模块项目,包含commons和app两个模块:

  • commons模块包含AspectJ切面类BasicCommonAspect和注解BasicCommonAnnotation
  • app模块依赖commons,其AppBackground.run()方法标注了BasicCommonAnnotation,入口类RunApp调用该方法
  • 使用io.freefair.aspectj.post-compile-weaving插件实现编译后织入,同时集成Project Lombok
  • 运行时切面通知未触发,尝试用inpath引入commons模块后出现类型缺失错误(如无法识别org.springframework.web.server.WebExceptionHandler),需配置仅引入特定包下的切面类

正确配置方案

1. Commons模块配置(build.gradle)

该模块需编译生成包含AspectJ切面信息的class文件,配置如下:

plugins {
    id 'java'
    id 'io.freefair.aspectj' version '8.6' // 替换为你使用的插件版本
}

dependencies {
    implementation 'org.aspectj:aspectjrt:1.9.20' // 保持与app模块版本一致
    // Lombok依赖
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
}

aspectj {
    version '1.9.20' // 与aspectjrt版本一致
    compileOnly false
}

2. App模块配置(build.gradle)

核心是将commons模块作为切面库引入,同时限制仅加载指定包的切面类,避免不必要的依赖引入:

plugins {
    id 'java'
    id 'io.freefair.aspectj.post-compile-weaving' version '8.6' // 与commons模块插件版本一致
}

dependencies {
    // 普通依赖commons模块,用于注解和业务类引用
    implementation project(':commons')
    // 将commons模块作为切面源,仅引入指定包下的切面类
    aspectpath(project(':commons')) {
        include 'com/yourpackage/commons/aspect/**' // 替换为切面类实际所在包路径(斜杠分隔)
    }
    implementation 'org.aspectj:aspectjrt:1.9.20' // AspectJ运行时依赖
    // Lombok依赖
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
}

aspectj {
    version '1.9.20'
    postCompileWeaving {
        enabled = true
    }
}

// 可选:排除commons模块中导致类型缺失的传递依赖
configurations {
    aspectpath {
        exclude group: 'org.springframework', module: 'spring-web' // 示例:排除spring-web依赖
    }
}

关键说明

  • aspectpath vs inpath:aspectpath专门用于指定切面所在的模块/依赖,AspectJ会从中加载切面类并织入目标代码;而inpath是将目标类加入织入范围,此处不需要全量引入commons模块到inpath。
  • 包路径过滤:通过include指定切面类的包路径,避免将commons模块中所有类都加入切面处理流程,减少不必要的依赖加载,解决类型缺失问题。
  • 版本一致性:确保AspectJ插件版本、aspectjrt版本在两个模块中完全一致,避免版本冲突。

验证步骤

  1. 执行./gradlew clean build完成项目构建
  2. 运行RunApp入口类,检查BasicCommonAspect中的通知方法是否正常触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:02:05