将注解处理器与Gradle集成

29
我需要编写一些注解处理器。我找到了这篇博客文章,其中提到了如何在通用设置和Eclipse中完成此操作。
但是我正在使用IntelliJ IDEA和Gradle,并且希望有更好(也就是说,不那么繁琐)的方法来完成它。我正在寻找以下内容:
1. 我应该能够在同一个项目中编写注解处理器和将要使用它们的代码,Gradle应该能够处理将处理器添加到类路径中并在适当阶段使用javac调用它们。 或者 2. 如果上述不可能,我必须创建两个单独的项目,那么至少应该可以将它们保存在同一个git存储库中。Gradle应该无缝处理构建。 或者 3. 如果都不可能,我必须创建两个单独的git存储库,那么至少Gradle应该能够无需进一步手动干预即可处理链接的博客文章中提到的事情。
我的git和Gradle技能是初学者级别。我将感激任何对此任务的帮助。谢谢。
2个回答

9

是的,可以将处理器移动到分离的模块中,并从另一个模块中使用它(请参见下面的querydslapt)。

我建议您实现自己的AbstractProcessor并像这样使用它:

dependencies {
    ....
    // put dependency to your module with processor inside
    querydslapt "com.mysema.querydsl:querydsl-apt:$querydslVersion" 
}

task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') {
    source = sourceSets.main.java // input source set
    classpath = configurations.compile + configurations.querydslapt // add processor module to classpath
    // specify javac arguments
    options.compilerArgs = [
            "-proc:only",
            "-processor", "com.mysema.query.apt.jpa.JPAAnnotationProcessor" // your processor here
    ]
    // specify output of generated code
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next()
}

你可以在 这里 找到完整的示例。

9

我认为更干净的解决方案是创建两个子项目,然后将包含注解处理器的项目作为主项目的依赖项。因此,在您的项目根目录下有两个子项目目录:coreannotation-processors,您还需要一个settings.gradle文件,其中包含以下内容:

include 'core'
include 'annotation-processors'

然后在核心项目的gradle文件中:

dependencies {
    compile project(':annotation-processors')
}

那就这样吧,这样您就不必处理自定义编译任务及其类路径。

是的,你说得对。在我的例子中,“querydsl-apt”应该被替换为某个子项目。 - Michail Nikolaev
3
注解处理器需要包含文件src/main/resources/META-INF/services/javax.annotation.processing.Processor,该文件中引用了您的处理器。 - FeelGood
只要coreannotation-processors不是库本身的一部分,这个方法就能很好地工作,因为Gradle仍然不支持递归包含(只能使用一个settings.gradle)。 - Simon Warta
小心,我刚刚花了15分钟试图弄清楚为什么javax.annotation.processing.Processor不起作用。在换行处,StackOverflow添加了一个零宽度空格,在“processing”中的两个s之间。 - user1779715

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接