Gradle中的注释处理器将源文件输出到构建/类,使javadoc失败.怎么解决?

Zub*_*zub 6 java javadoc gradle annotation-processing

我有一个注释处理器,在构建时由Java编译器自动拾取(使用SPI).在gradle构建期间,此批注处理器的生成的java源放在构建/类中,因为Gradle告诉注释处理器这是输出生成的源文件的位置.

当运行标准的javadoc任务时,它会尝试为build/classes中的所有文件创建javadoc,包括*.java.这很糟糕,因为javadoc只需要*.class文件,这使整个构建失败.

所以我的问题是:

这是Gradle bug /功能吗?我该如何解决它/使它工作?

Zub*_*zub 4

问题似乎是生成的源文件没有被拾取,导致 javadoc 失败,因为它没有任何可处理的内容。

我在这里发布解决方案,以防有人遇到同样的问题:

gradle 中编译时源生成的问题是 javadoc 不会自动选取输出的源。如果所有源都是自动生成的,这就是一个问题。构建将失败并显示错误,指出无法处理任何源。在另一种情况下,您的构建将成功,但您将没有生成的 java 源的 javadoc。

这里的根本问题是 gradle 与在同一编译步骤中生成和编译的生成源集成不佳。为了解决这个问题,我将我的构建文件更改为这个。

项目布局:

  • 根项目
  • 根项目/annotationProcessor
  • rootproject/userOfAnnotationProcessor

userOfAnnotationProcessor的构建文件

def generatedSources = "$buildDir/generated-src"
def generatedOutputDir = file("$generatedSources")

compileJava {
    doFirst {
        generatedOutputDir.exists() || generatedOutputDir.mkdirs()
        options.compilerArgs = [
                '-s', "${generatedSources}"
        ]
    }
}


sourceSets {
    main {
        java {
            srcDirs += generatedOutputDir
        }
    }
}

javadoc {
    source = sourceSets.main.resources
}
compileJava.dependsOn clean
Run Code Online (Sandbox Code Playgroud)

这里的技巧是不要生成的源添加到自定义源集中,否则在尝试在根项目中构建聚合 javadoc 时我们会遇到麻烦。然而,这个解决方案有一个令人讨厌的副作用,即我们生成的源或在第一次清理+构建后尝试构建时由于某种原因添加了两次。这里的解决方案是始终进行清理+构建。

现在,在进行聚合 javadoc 构建时,我们希望生成的源 javadoc 也成为其中的一部分。

这就是我们的根项目构建文件的样子:

def exportedProjects = [
        ":annotationProcessor",
        ":userOfAnnotationProcessor",
]

task alljavadoc(type: Javadoc) {
    source exportedProjects.collect { project(it).sourceSets.main.allJava }
    classpath = files(exportedProjects.collect { project(it).sourceSets.main.compileClasspath })
    destinationDir = file("${buildDir}/docs/javadoc")
}


alljavadoc.dependsOn(":userOfAnnotationProcessor:compileJava")
Run Code Online (Sandbox Code Playgroud)

如果我们之前使用了自定义源集,gradle 现在会开始抱怨未找到源集属性。为什么?我不知道...最后一个需要注意的重要事情是我们的 alljavadoc 取决于userOfAnnotationProcessor的编译步骤,这是为了确保构建聚合 javadoc 时我们生成的源文件在那里。

我希望我的解释能帮助别人!