【问题标题】:Gradle and AspectJ - avoid weaving my own packages during compile timeGradle 和 AspectJ - 避免在编译时编织我自己的包
【发布时间】:2016-03-06 12:05:12
【问题描述】:

我正在创建一个与 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"


}

谢谢

【问题讨论】:

    标签: gradle aspectj gradle-plugin


    【解决方案1】:

    如果您的类都在一个特殊包或其任何子包中,例如my.company.blah,只需将其添加到您的切入点:

    && !within(my.company.blah..*)
    

    【讨论】:

    • 谢谢。我不想修改代码,只是为了能够在编译时排除方面,所以这更像是一个 gradle config 问题。
    【解决方案2】:

    问题通过以下方式解决:

    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)
    

    ...

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 2013-03-18
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多