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

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

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

所以我的问题是:

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

似乎问题是生成的源文件没有被拾取,使得javadoc失败,因为它没有任何东西可以处理。

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

在gradle中生成编译时间源的问题是输出的源不会被javadoc自动拾取。 如果所有源都是自动生成的,则会出现问题。 构建将失败,并显示错误消息,表示无法处理任何源。 在另一种情况下,您的构建将成功,但您将没有生成的Java源的javadoc。

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

项目布局:

  • rootproject
  • rootproject / annotationProcessor
  • rootproect / 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 

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

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

这是我们的rootproject构建文件的样子:

 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") 

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

我希望我已经用这个解释帮助了sombody!

我不太确定天气是不是一个小虫。 但作为一种解决方法只是过滤javadoc的来源。

根据构建脚本的外观,它应该看起来像thistask

 myJavadocs(type: Javadoc) { classpath = sourceSets.main.output.filter { it -> !it.name.endsWith('.java') } }