Java 使用Gradle将方面编译后编织到项目中 背景

Java 使用Gradle将方面编译后编织到项目中 背景,java,gradle,aop,aspectj,Java,Gradle,Aop,Aspectj,使用以下工具执行项目的编译后编织: AspectJ 1.9.4 io.freefair.aspectj.post-compile-weaving 4.1.1 Java 11.0.3 Gradle 5.6.2(Groovy 2.5.4,Kotlin 1.3.41) 此项目不使用Maven或Spring 布局 这些项目包括: app.Aspect-包含一个用@Aspect注释的LogAspect类 app.aspects.weaver-没有源文件,只有用于声明aspects和要weave的项目

使用以下工具执行项目的编译后编织:

  • AspectJ 1.9.4
  • io.freefair.aspectj.post-compile-weaving 4.1.1
  • Java 11.0.3
  • Gradle 5.6.2(Groovy 2.5.4,Kotlin 1.3.41)
此项目不使用Maven或Spring

布局 这些项目包括:

  • app.Aspect
    -包含一个用
    @Aspect
    注释的
    LogAspect
  • app.aspects.weaver
    -没有源文件,只有用于声明aspects和要weave的项目的依赖项
  • app.common
    -定义
    @Log
    中描述的切入点引用的注释
  • app.program.main
    -要用
    LogAspect
    中描述的接合点编织的文件
格拉德尔 这里定义了与方面相关的构建文件。其思想是编织独立于应用程序,因此应用程序的公共类和主程序都不需要知道编织。相反,主程序只需要从通用包中引用
@Log
,AJC将负责编织

app.aspects app.aspects.weaver 班级 日志
Log
注释很简单:

package com.app.common.aspects;
@保留(RetentionPolicy.RUNTIME)
@目标({ElementType.METHOD,ElementType.TYPE,ElementType.CONSTRUCTOR})
公共@接口日志{
布尔安全()默认值为false;
}
主程序 主程序类似于:

package com.app.program.main;
导入com.app.common.aspects.Log;
@日志
公共课程{
/**这就是编织的方法*/
受保护的void run()引发InterruptedException、TimeoutException{
}
}
日志方面 日志方面类似于(请参见a中的代码):

@方面
公共类日志方面{
//将来,这将以@Log注释的点为目标
@切入点(“执行(*com.app.program.main.program.run(..)”)
公共无效日志类(){
}
@环绕(“loggedClass()”)
公共对象日志(最终进程joinPoint joinPoint)抛出可丢弃{
返回日志(joinPoint,false);
}
私有对象日志(最终进程joinPoint joinPoint,布尔安全)抛出可丢弃的{
//有关完整列表,请参见去年的代码
log.info(“\u21B7{}{}{}{}({})”,缩进,类名,成员名,参数);
}
}
问题 似乎正在编织,但找不到建议:

…/app.aspects/build/classes/java/main!尚未应用com.app.aspects.LogAspect中定义的com/app/aspects/LogAspect.class[警告]通知[Xlint:adviceDidNotMatch]

问题: 需要进行哪些更改,以便使用Gradle将
LogAspect
编织到
程序的
run()
方法中

选项文件
ajc.options
文件显示:

-inpath
.../app.aspects/build/classes/java/main
-classpath
.../.gradle/caches/modules-2/files-2.1/org.aspectj/...
-d
.../app.aspects/build/classes/java/main
-target
11
-source
11

令人不安的是,
-aspectpath
没有显示,
-inpath
正在列出
app.aspects
,而不是
app.program.main

apps.aspects
apps.aspects.weaver
合并到同一项目中产生了:

类型“com.app.program.main.program”(program.java:396)中的连接点“方法执行(void com.app.program.main.program.run())”,由来自“com.app.aspects.LogAspect”(LogAspect.class(来自LogAspect.java))的Abround建议

虽然这解决了问题,但我不明白为什么
LogAspect
需要在执行编织的同一个项目中。渐变文件变为:

apply plugin: "io.freefair.aspectj.post-compile-weaving"

dependencies {
    compileOnly "org.aspectj:aspectjrt:1.9.4"
    compileOnly project(':app.common')
    compileOnly project(':app.program.main')

    compileOnly org_apache_logging_log4j__log4j_api

    inpath(project(":app.program.main")) {
        transitive = false
    }
}

compileJava.ajc.options.compilerArgs += "-showWeaveInfo"
compileJava.ajc.options.compilerArgs += "-verbose"
-inpath
.../app.aspects/build/classes/java/main
-classpath
.../.gradle/caches/modules-2/files-2.1/org.aspectj/...
-d
.../app.aspects/build/classes/java/main
-target
11
-source
11
apply plugin: "io.freefair.aspectj.post-compile-weaving"

dependencies {
    compileOnly "org.aspectj:aspectjrt:1.9.4"
    compileOnly project(':app.common')
    compileOnly project(':app.program.main')

    compileOnly org_apache_logging_log4j__log4j_api

    inpath(project(":app.program.main")) {
        transitive = false
    }
}

compileJava.ajc.options.compilerArgs += "-showWeaveInfo"
compileJava.ajc.options.compilerArgs += "-verbose"