如何失败 gradle 基于 Javadoc 警告构建
How to fail gradle build on Javadoc warnings
我正在使用 Java 7(尽管使用 1.6 进行编译)来编译 类 和 javadoc。我已经消除了所有出现的 javadoc 警告,但我的想法是如果有任何 javadoc 警告则让构建失败。
使用Java 8,这是默认行为。但是,它在警告方面也更加严格(如果方法未列出所有@params 或@returns,我们不希望收到警告)。另外,我认为公司不会很快升级到 8,所以这是一个有争议的问题。
我希望有一些简单的标志可以设置 gradle 如果有警告(只有 failonError)就会失败。我在想的是抓取 javadoc 进程的控制台输出。如果该输出包含警告,那么我知道有警告,构建应该会失败。
这是我 build.gradle 中的 javadoc 块:
task gendocs(type: Javadoc) {
options.stylesheetFile = new File("./assets/doc_style.css")
options.windowTitle = "OurTitle"
options.memberLevel = JavadocMemberLevel.PROTECTED
options.author = true
options.linksOffline('http://d.android.com/reference', System.getenv("ANDROID_HOME") + '/docs/reference')
String v = "${SEMVER}"
version = v.replace("_", '.')
destinationDir = new File("${BUNDLE_FOLDER}/docs/api")
source = sourceSets.main.allJava
classpath += configurations.compile
}
那么,如果没有更简单的方法来执行此操作,我该如何检查 javadoc 的控制台输出以抓取它?
注意:我已经完全替换了原来的答案,因为我找到了一个更好的答案——它并不那么丑陋:
import org.gradle.logging.internal.OutputEvent
import org.gradle.logging.internal.OutputEventListener
task("javadocCheck",type:Javadoc){
// regular javadoc task configuration
def outputEvents = []
def listener=new OutputEventListener(){
void onOutput(OutputEvent event){
outputEvents << event
}
};
doFirst {
getLogging().addOutputEventListener(listener)
}
doLast {
getLogging().removeOutputEventListener(listener)
outputEvents.each { e ->
if(e.toString() =~ " warning: "){
throw new GradleException("You have some javadoc warnings, please fix them!");
}
}
}
}
task.getLogging() 现已弃用,LoggingManagerInternal#addOutputEventListener() 已被删除。
这是一个适用于 Gradle >2.14.
的解决方案
import org.gradle.api.logging.StandardOutputListener
task("javadocCheck",type: Javadoc) {
// regular javadoc task configuration
def capturedOutput = []
def listener = { capturedOutput << it } as StandardOutputListener
doFirst {
logging.addStandardErrorListener(listener)
logging.addStandardOutputListener(listener)
}
doLast {
logging.removeStandardOutputListener(listener)
logging.removeStandardErrorListener(listener)
capturedOutput.each { e ->
if(e.toString() =~ " warning: ") {
throw new GradleException("You have some javadoc warnings, please fix them!");
}
}
}
}
有一个 non-standard 隐藏的 javadoc 选项 -Xwerror
在所有受支持的 Java 版本上可用。因此你可以简单地做这样的事情:
if (JavaVersion.current().isJava8Compatible()) {
tasks.withType(Javadoc) {
// The '-quiet' as second argument is actually a hack,
// since the one paramater addStringOption doesn't seem to
// work, we extra add '-quiet', which is added anyway by
// gradle. See https://github.com/gradle/gradle/issues/2354
// See JDK-8200363 (https://bugs.openjdk.java.net/browse/JDK-8200363)
// for information about the -Xwerror option.
options.addStringOption('Xwerror', '-quiet')
}
}
针对 javadoc 的官方“-Werror”的功能请求被跟踪为 JDK-8200363。此功能现在在 JDK 15+ 中可用,因为 -Werror
,-Xwerror
也可以用作别名。
我只是想跟进这个,因为接受的答案在我的环境中使用 JDK 11 和 Gradle 5 不起作用。这是我用来解决编译警告的一个:
import org.gradle.internal.logging.*
import org.gradle.internal.logging.events.*
compileJava {
def outputEvents = []
def listener=new OutputEventListener() {
void onOutput(OutputEvent event) {
outputEvents << event
}
};
doFirst {
gradle.services.get(LoggingOutputInternal).addOutputEventListener(listener)
}
doLast {
gradle.services.get(LoggingOutputInternal).removeOutputEventListener(listener)
outputEvents.each { e ->
if (e.toString() =~ " warning: ") {
throw new GradleException("\n\n\tERROR: You have compilation warnings!\n\n")
}
}
}
}
我正在使用 Java 7(尽管使用 1.6 进行编译)来编译 类 和 javadoc。我已经消除了所有出现的 javadoc 警告,但我的想法是如果有任何 javadoc 警告则让构建失败。
使用Java 8,这是默认行为。但是,它在警告方面也更加严格(如果方法未列出所有@params 或@returns,我们不希望收到警告)。另外,我认为公司不会很快升级到 8,所以这是一个有争议的问题。
我希望有一些简单的标志可以设置 gradle 如果有警告(只有 failonError)就会失败。我在想的是抓取 javadoc 进程的控制台输出。如果该输出包含警告,那么我知道有警告,构建应该会失败。
这是我 build.gradle 中的 javadoc 块:
task gendocs(type: Javadoc) {
options.stylesheetFile = new File("./assets/doc_style.css")
options.windowTitle = "OurTitle"
options.memberLevel = JavadocMemberLevel.PROTECTED
options.author = true
options.linksOffline('http://d.android.com/reference', System.getenv("ANDROID_HOME") + '/docs/reference')
String v = "${SEMVER}"
version = v.replace("_", '.')
destinationDir = new File("${BUNDLE_FOLDER}/docs/api")
source = sourceSets.main.allJava
classpath += configurations.compile
}
那么,如果没有更简单的方法来执行此操作,我该如何检查 javadoc 的控制台输出以抓取它?
注意:我已经完全替换了原来的答案,因为我找到了一个更好的答案——它并不那么丑陋:
import org.gradle.logging.internal.OutputEvent
import org.gradle.logging.internal.OutputEventListener
task("javadocCheck",type:Javadoc){
// regular javadoc task configuration
def outputEvents = []
def listener=new OutputEventListener(){
void onOutput(OutputEvent event){
outputEvents << event
}
};
doFirst {
getLogging().addOutputEventListener(listener)
}
doLast {
getLogging().removeOutputEventListener(listener)
outputEvents.each { e ->
if(e.toString() =~ " warning: "){
throw new GradleException("You have some javadoc warnings, please fix them!");
}
}
}
}
task.getLogging() 现已弃用,LoggingManagerInternal#addOutputEventListener() 已被删除。
这是一个适用于 Gradle >2.14.
的解决方案 import org.gradle.api.logging.StandardOutputListener
task("javadocCheck",type: Javadoc) {
// regular javadoc task configuration
def capturedOutput = []
def listener = { capturedOutput << it } as StandardOutputListener
doFirst {
logging.addStandardErrorListener(listener)
logging.addStandardOutputListener(listener)
}
doLast {
logging.removeStandardOutputListener(listener)
logging.removeStandardErrorListener(listener)
capturedOutput.each { e ->
if(e.toString() =~ " warning: ") {
throw new GradleException("You have some javadoc warnings, please fix them!");
}
}
}
}
有一个 non-standard 隐藏的 javadoc 选项 -Xwerror
在所有受支持的 Java 版本上可用。因此你可以简单地做这样的事情:
if (JavaVersion.current().isJava8Compatible()) {
tasks.withType(Javadoc) {
// The '-quiet' as second argument is actually a hack,
// since the one paramater addStringOption doesn't seem to
// work, we extra add '-quiet', which is added anyway by
// gradle. See https://github.com/gradle/gradle/issues/2354
// See JDK-8200363 (https://bugs.openjdk.java.net/browse/JDK-8200363)
// for information about the -Xwerror option.
options.addStringOption('Xwerror', '-quiet')
}
}
针对 javadoc 的官方“-Werror”的功能请求被跟踪为 JDK-8200363。此功能现在在 JDK 15+ 中可用,因为 -Werror
,-Xwerror
也可以用作别名。
我只是想跟进这个,因为接受的答案在我的环境中使用 JDK 11 和 Gradle 5 不起作用。这是我用来解决编译警告的一个:
import org.gradle.internal.logging.*
import org.gradle.internal.logging.events.*
compileJava {
def outputEvents = []
def listener=new OutputEventListener() {
void onOutput(OutputEvent event) {
outputEvents << event
}
};
doFirst {
gradle.services.get(LoggingOutputInternal).addOutputEventListener(listener)
}
doLast {
gradle.services.get(LoggingOutputInternal).removeOutputEventListener(listener)
outputEvents.each { e ->
if (e.toString() =~ " warning: ") {
throw new GradleException("\n\n\tERROR: You have compilation warnings!\n\n")
}
}
}
}