7

ANT 中有一个解决方案,但是我们如何使用 gradle 来实现呢?是否可以通过编译后编织来做到这一点。意思是用 lombok 编译以获取所有生成的 delombok 代码,然后在这个生成的 delombok 代码上编织方面而不是 aspectJ 将其清除?

下面的这些 SO 帖子似乎没有任何关于如何解决这个问题的结论?

Lombok 不能与 AspectJ 一起使用? Gradle + RoboBinding 与 AspectJ + Lombok 不兼容

讨论线程 http://aspectj.2085585.n4.nabble.com/AspectJ-with-Lombok-td4651540.html

谢谢你,塞策

4

1 回答 1

2

实际上这个问题已经很老了,但是由于遇到了同样的问题,我还是想分享我的解决方案。

我找到的最佳解决方案是this。事实上,Gradle 中没有对 AspectJ 的内置支持,并且现有的插件(例如,Gradle AspectJ 插件)不适用于 Lombok。所以解决方案是在你的代码中手动启用编译时编织。为 Java 8 准备好的 gradle.build 是这样的

buildscript {
    repositories {
        jcenter()
        maven { url 'http://repo.spring.io/plugins-release' }
    }

    dependencies {

    }
}

apply plugin: 'idea' // if you use IntelliJ
apply plugin: 'java'

ext {
    aspectjVersion = '1.8.9'
    springVersion = '4.2.1.RELEASE'
}

repositories {
    jcenter()
}

configurations {
    ajc
    aspects
    compile {
        extendsFrom aspects
    }
}

dependencies {
    compile "org.aspectj:aspectjrt:$aspectjVersion"
    compile "org.aspectj:aspectjweaver:$aspectjVersion"

    ajc "org.aspectj:aspectjtools:$aspectjVersion"
    aspects "org.springframework:spring-aspects:$springVersion"
}

def aspectj = { destDir, aspectPath, inpath, classpath ->
    ant.taskdef(resource: "org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties",
            classpath: configurations.ajc.asPath)

    ant.iajc(
            maxmem: "1024m", fork: "true", Xlint: "ignore",
            destDir: destDir,
            aspectPath: aspectPath,
            inpath: inpath,
            classpath: classpath,
            source: project.sourceCompatibility,
            target: project.targetCompatibility
    )
}

compileJava {
    doLast {
        aspectj project.sourceSets.main.output.classesDir.absolutePath,
                configurations.aspects.asPath,
                project.sourceSets.main.output.classesDir.absolutePath,
                project.sourceSets.main.runtimeClasspath.asPath
    }
}

compileTestJava {
    dependsOn jar

    doLast {
        aspectj project.sourceSets.test.output.classesDir.absolutePath,
                configurations.aspects.asPath + jar.archivePath,
                project.sourceSets.test.output.classesDir.absolutePath,
                project.sourceSets.test.runtimeClasspath.asPath
    }
}

您可以在上面已经提到的文章中找到其他说明。这里给出的 build.gradle 是文章中给出的更新版本,以允许使用 Java 8 和 AspectJ 版本 1.8.9,此外还删除了所有不必要的东西。

于 2017-07-12T10:09:24.587 回答