Gradle 和 AspectJ - 避免在编译时编织我自己的包
Gradle and AspectJ - avoid weaving my own packages during compile time
我正在创建一个与 spring 无关的 aspectj 项目。方方面面都是我写的。到目前为止,我一直在使用 "ant" 构建来编译我的代理,现在我正在尝试移动到 gradle.
我的问题 - 我不希望我的 类 被检测,但是 ajc 也编织了我的代码,所以如果我要添加一个点切换到 "someFunction()" 函数,我的代码 com.myproject.MyClass 有一个名为 "someFunction" 的函数 它将被检测。
如何将 gradle aspectj 插件配置为不在 "com.myProject" 中检测 类? (在运行时是 aop.xml 文件,但问题出在编译时)。
我的代码:
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'eclipse-wtp'
ext.aspectjVersion = '1.8.8'
configurations {
ajc
aspects
aspectCompile
ajInpath
compile {
extendsFrom aspects
}
}
publishing {
publications {
mavenJava(MavenPublication) { from components.java }
}
}
repositories {
jcenter()
}
compileJava {
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
doLast {
ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
classpath: configurations.ajc.asPath)
ant.iajc(
source: sourceCompatibility,
target: targetCompatibility,
destDir: sourceSets.main.output.classesDir.absolutePath,
maxmem: "512m",
fork: "true",
inpath: configurations.ajInpath.asPath,
aspectPath: configurations.aspects.asPath,
Xlint: "ignore",
sourceRootCopyFilter: "**/*.java, **/*.class, **/*.aj",
classpath: "${configurations.compile.asPath};${configurations.aspectCompile.asPath}") {
sourceroots {
sourceSets.main.java.srcDirs.each {
pathelement(location: it.absolutePath)
}
}
}
}
}
dependencies {
ajc "org.aspectj:aspectjtools:1.8.8"
compile "org.aspectj:aspectjrt:1.8.8"
}
谢谢
如果您的 类 都在一个特殊包或其任何子包中,例如my.company.blah
,只需将其添加到您的切入点:
&& !within(my.company.blah..*)
问题解决方法:
- 首先编译代码
- 然后添加具有特定类路径和源的 aspectj 编译。
这意味着我没有实施 compileJava,而是添加了一个名为 compileAjc 的新任务,该任务取决于 compileJava 的输出:
task compileAjc(overwrite: true) {
// Declare the output directory to enable uptodate checks
outputs.dir sourceSets.main.output.classesDir
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
doLast {
ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
classpath: configurations.ajc.asPath)
ant.iajc(
source: sourceCompatibility,
target: targetCompatibility,
destDir: sourceSets.main.output.classesDir.absolutePath,
maxmem: "512m",
fork: "true",
// Jars containing classes where aspects should be woven into should be declared in the ajInpath configuration
inpath: configurations.ajInpath.asPath,
// Jars containing aspects to be woven should be declared in the aspects configuration
aspectPath: configurations.aspects.asPath,
Xlint: "ignore",
sourceRootCopyFilter: "**/*",
classpath: "${configurations.compile.asPath};${sourceSets.main.output.classesDir};**",
sourceroots: 'src/main/java/com/my/stuff/aspects'
)
}
}
...
processResources.dependsOn(compileAjc)
...
我正在创建一个与 spring 无关的 aspectj 项目。方方面面都是我写的。到目前为止,我一直在使用 "ant" 构建来编译我的代理,现在我正在尝试移动到 gradle.
我的问题 - 我不希望我的 类 被检测,但是 ajc 也编织了我的代码,所以如果我要添加一个点切换到 "someFunction()" 函数,我的代码 com.myproject.MyClass 有一个名为 "someFunction" 的函数 它将被检测。
如何将 gradle aspectj 插件配置为不在 "com.myProject" 中检测 类? (在运行时是 aop.xml 文件,但问题出在编译时)。
我的代码:
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'eclipse-wtp'
ext.aspectjVersion = '1.8.8'
configurations {
ajc
aspects
aspectCompile
ajInpath
compile {
extendsFrom aspects
}
}
publishing {
publications {
mavenJava(MavenPublication) { from components.java }
}
}
repositories {
jcenter()
}
compileJava {
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
doLast {
ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
classpath: configurations.ajc.asPath)
ant.iajc(
source: sourceCompatibility,
target: targetCompatibility,
destDir: sourceSets.main.output.classesDir.absolutePath,
maxmem: "512m",
fork: "true",
inpath: configurations.ajInpath.asPath,
aspectPath: configurations.aspects.asPath,
Xlint: "ignore",
sourceRootCopyFilter: "**/*.java, **/*.class, **/*.aj",
classpath: "${configurations.compile.asPath};${configurations.aspectCompile.asPath}") {
sourceroots {
sourceSets.main.java.srcDirs.each {
pathelement(location: it.absolutePath)
}
}
}
}
}
dependencies {
ajc "org.aspectj:aspectjtools:1.8.8"
compile "org.aspectj:aspectjrt:1.8.8"
}
谢谢
如果您的 类 都在一个特殊包或其任何子包中,例如my.company.blah
,只需将其添加到您的切入点:
&& !within(my.company.blah..*)
问题解决方法:
- 首先编译代码
- 然后添加具有特定类路径和源的 aspectj 编译。
这意味着我没有实施 compileJava,而是添加了一个名为 compileAjc 的新任务,该任务取决于 compileJava 的输出:
task compileAjc(overwrite: true) {
// Declare the output directory to enable uptodate checks
outputs.dir sourceSets.main.output.classesDir
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
doLast {
ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
classpath: configurations.ajc.asPath)
ant.iajc(
source: sourceCompatibility,
target: targetCompatibility,
destDir: sourceSets.main.output.classesDir.absolutePath,
maxmem: "512m",
fork: "true",
// Jars containing classes where aspects should be woven into should be declared in the ajInpath configuration
inpath: configurations.ajInpath.asPath,
// Jars containing aspects to be woven should be declared in the aspects configuration
aspectPath: configurations.aspects.asPath,
Xlint: "ignore",
sourceRootCopyFilter: "**/*",
classpath: "${configurations.compile.asPath};${sourceSets.main.output.classesDir};**",
sourceroots: 'src/main/java/com/my/stuff/aspects'
)
}
}
...
processResources.dependsOn(compileAjc)
...