1

I'm creating an aspectj project, which is NOT spring related. All the aspects were written by me. So Far I've been working with "ant" build to compile my agent, and now I'm trying to move to gradle.

My problem - I don't want my classes to be instrumented, but the ajc weaves my code as well, so if I'm adding a point cut to "someFunction()" function and my code com.myproject.MyClass has a function called "someFunction" it will be instrumented.

How can I configure the gradle aspectj plugin to NOT instrument classes in "com.myProject"? (during runtime it's the aop.xml file, but the problem is in compile time).

My code:

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"


}

Thanks

Lin
  • 2,445
  • 5
  • 27
  • 37

2 Answers2

1

If your classes are all within a special package or any of its subpackages, e.g. my.company.blah, just add this to your pointcuts:

&& !within(my.company.blah..*)
kriegaex
  • 63,017
  • 15
  • 111
  • 202
  • 1
    Thanks. I don't want to modify the code, just to be able to exclude aspects during compile time, so it's more of a gradle config problem. – Lin Mar 06 '16 at 17:41
1

The problem is solved by:

  1. first compiling the code
  2. then adding the aspectj compilation with the specific classpath and sources.

This means that instead of implementing compileJava I added a new task called compileAjc that depends on compileJava's output:

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)

...

Lin
  • 2,445
  • 5
  • 27
  • 37