Zub*_*zub 6 java javadoc gradle annotation-processing
我有一个注释处理器,在构建时由Java编译器自动拾取(使用SPI).在gradle构建期间,此批注处理器的生成的java源放在构建/类中,因为Gradle告诉注释处理器这是输出生成的源文件的位置.
当运行标准的javadoc任务时,它会尝试为build/classes中的所有文件创建javadoc,包括*.java.这很糟糕,因为javadoc只需要*.class文件,这使整个构建失败.
所以我的问题是:
这是Gradle bug /功能吗?我该如何解决它/使它工作?
问题似乎是生成的源文件没有被拾取,导致 javadoc 失败,因为它没有任何可处理的内容。
我在这里发布解决方案,以防有人遇到同样的问题:
gradle 中编译时源生成的问题是 javadoc 不会自动选取输出的源。如果所有源都是自动生成的,这就是一个问题。构建将失败并显示错误,指出无法处理任何源。在另一种情况下,您的构建将成功,但您将没有生成的 java 源的 javadoc。
这里的根本问题是 gradle 与在同一编译步骤中生成和编译的生成源集成不佳。为了解决这个问题,我将我的构建文件更改为这个。
项目布局:
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 时我们生成的源文件在那里。
我希望我的解释能帮助别人!
| 归档时间: |
|
| 查看次数: |
3828 次 |
| 最近记录: |