我想在构建过程中使用 QueryDSL 注释处理器。每次更改任何类时,如何摆脱不必要的注释处理器编译和运行?我希望 QueryDSL 仅在更改某些相关类时才生成 Q-* 类。
这个始终运行的注释处理器对我们的构建过程时间有负面影响,如果必须运行注释处理器,增量构建似乎不起作用。
谢谢你。
我想在构建过程中使用 QueryDSL 注释处理器。每次更改任何类时,如何摆脱不必要的注释处理器编译和运行?我希望 QueryDSL 仅在更改某些相关类时才生成 Q-* 类。
这个始终运行的注释处理器对我们的构建过程时间有负面影响,如果必须运行注释处理器,增量构建似乎不起作用。
谢谢你。
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。
希望我的观点很清楚。
AFAIK 这目前是不可能的:请参阅此博客文章- “使用注释处理器进行增量编译”部分:
...使用注释处理器,Gradle 不知道它们将生成哪些文件。它也不知道在哪里以及基于什么条件。因此,如果注释处理器正在使用中,Grade 会禁用 Java 增量编译器
Gradle 的相关问题:在存在注释处理器的情况下提高增量编译效率 #1320
博客文章还提到了一种可能的解决方法:
然而,可以将其影响限制在真正使用注释处理器的类集上。简而言之,您可以使用不同的编译任务声明一个不同的源集,它将使用注释处理器,而其他编译任务则无需任何类型的注释处理
但是,这似乎是一项相当多的工作,所以我还没有使用它。