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)
-包含一个用app.Aspect
注释的@Aspect
类LogAspect
-没有源文件,只有用于声明aspects和要weave的项目的依赖项app.aspects.weaver
-定义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"