我想使用QueryDSL注释处理器作为构建过程的一部分。我怎样才能摆脱不必要的注释处理器编译和运行每次我更改任何类?我希望QueryDSL只在某些相关类被更改时生成Q- *类。
这个始终运行的注释处理器对我们的构建过程时间有负面影响,如果注释处理器必须运行,看起来增量构建不起作用。
谢谢。
答案 0 :(得分:3)
Gradle无法知道哪些文件注释处理器使用作为输入,因此每次监视目录中的某些内容发生更改(src)时都必须触发完全重新编译。
但是,您可以轻松告诉Gradle哪些文件只应触发注释处理。更改为其他文件不会触发使用注释处理器,并且gradle可以使用其所有功能(例如增量构建)。
我还添加了“强制”任务 buildWithAP ,无论提示(启发式)函数结果如何,都可以调用注释处理器。
我的解决方案:
ext.isTask = { name -> return project.gradle.startParameter.taskNames.contains(name) }
/**
* Heuristic function allowing to build process guess if annotation processor run is necessary
* Annotation processors will not be called during build task if this function returns FALSE
*/
ext.isApInvalidated = { -> return hasAnyFileRelatedToApChanged() }
dependencies {
if (isTask("buildWithAP") || isApInvalidated()) {
println "Going to run annotation processors ..."
apt "com.querydsl:querydsl-apt:$queryDslVersion:jpa"
...
} else {
// just add generated classes to the classpath
// must be in else branch or multiple AP calls will collide!
sourceSets.main.java.srcDirs += projectDir.absolutePath + "/build/generated/apt"
}
}
task buildWithAP (dependsOn: build) {}
您可以使用任何所需的注释处理器,例如您自己的注释处理器,而不仅仅是QueryDSL。
希望我的观点清楚。
答案 1 :(得分:2)
AFAIK目前无法做到这一点:请参阅此blog post - “使用注释处理器进行增量编译”:
...使用注释处理器,Gradle不知道它们将生成哪些文件。它也不知道在哪里以及基于什么条件。因此,如果正在使用注释处理器,则Grade会禁用Java增量编译器
Gradle的相关问题:Make incremental compile efficient in the presence of Annotation Processors #1320
博客文章还提到了一种可能的解决方法:
然而,可以将其影响限制为真正使用注释处理器的类集。简而言之,您可以使用注释处理器声明具有不同编译任务的不同源集,并保留其他编译任务而不进行任何类型的注释处理
然而,这似乎是一些工作,所以我还没有用过它。
答案 2 :(得分:0)