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..*)

问题解决方法:

  1. 首先编译代码
  2. 然后添加具有特定类路径和源的 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)

...