我想在构建过程中使用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。

希望我的观点清楚。

09-25 20:16