我希望在构建过程中使用QueryDSL注解处理器。我该如何做才能避免每次更改任何类时都进行不必要的注解处理器编译和运行?我希望只有在相关类发生更改时,QueryDSL才会生成Q-*类。
这种总是运行的注解处理器对我们的构建过程时间产生了负面影响,而且似乎增量构建无法正常工作,如果需要运行注解处理器。
谢谢。
这种总是运行的注解处理器对我们的构建过程时间产生了负面影响,而且似乎增量构建无法正常工作,如果需要运行注解处理器。
谢谢。
Gradle无法知道注解处理器使用哪些文件作为输入,因此每当监视目录(src)中的内容发生更改时,它必须触发完整的重新编译。
但是,您可以轻松地告诉Gradle哪些文件应该只触发注解处理。对其他文件的更改将不会触发注解处理器的使用,并且Gradle可以使用其全部功能(例如增量构建)。
我还添加了一个“force”任务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) {}
fileTree(dir: 'src', include: '**/*Entity.java')
。 - lukyerGradle相关问题:在存在注解处理器的情况下使增量编译更有效 #1320 博客文章还提到了一个可能的解决方法:...对于注解处理器,Gradle不知道它们将生成哪些文件。也不知道在哪里以及基于什么条件生成。因此,如果使用注解处理器,则Gradle会禁用Java增量编译器。
然而,这似乎需要相当多的工作,所以我尚未使用它。但是,可以将其限制为实际使用注解处理器的类集。简而言之,您可以声明不同的源集,并使用不同的编译任务来使用注解处理器,而将其他编译任务保持没有任何类型的注解处理。