3

我想在构建过程中使用 QueryDSL 注释处理器。每次更改任何类时,如何摆脱不必要的注释处理器编译和运行?我希望 QueryDSL 仅在更改某些相关类时才生成 Q-* 类。

这个始终运行的注释处理器对我们的构建过程时间有负面影响,如果必须运行注释处理器,增量构建似乎不起作用。

谢谢你。

4

3 回答 3

4

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。

希望我的观点很清楚。

于 2017-11-20T13:06:59.703 回答
2

AFAIK 这目前是不可能的:请参阅此博客文章- “使用注释处理器进行增量编译”部分:

...使用注释处理器,Gradle 不知道它们将生成哪些文件。它也不知道在哪里以及基于什么条件。因此,如果注释处理器正在使用中,Grade 会禁用 Java 增量编译器

Gradle 的相关问题:在存在注释处理器的情况下提高增量编译效率 #1320

博客文章还提到了一种可能的解决方法:

然而,可以将其影响限制在真正使用注释处理器的类集上。简而言之,您可以使用不同的编译任务声明一个不同的源集,它将使用注释处理器,而其他编译任务则无需任何类型的注释处理

但是,这似乎是一项相当多的工作,所以我还没有使用它。

于 2017-11-14T15:33:46.350 回答
-1

问题似乎已经解决了!https://issuetracker.google.com/issues/37079915

于 2019-01-17T05:37:43.710 回答