如何在Javadoc警告的基础上使gradle构建失败



我使用Java 7(尽管使用1.6编译)来编译类和javadocs。我已经消除了所有出现的javadoc警告,但我们的想法是,如果有任何javadoc警告的话,就让构建失败。

使用Java8时,这是默认行为。但是,当涉及到警告时,它也要严格得多(如果一个方法没有列出所有的@params或@return,我们就不想要警告)。另外,我不认为该公司会很快转向8,所以这是一个没有意义的问题。

我希望如果有警告(只有failonError),有一些简单的标志可以设置为gradle失败。我当时想的是抓取javadoc进程的控制台输出。如果该输出包含WARNINGS,那么我知道存在警告,构建应该会失败。

这是我的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的控制台输出来抓取它呢?

在所有支持的Java版本上都有一个非标准的隐藏javadoc选项-Xwerror。因此,你可以简单地做这样的事情:

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。这个特性现在在JDK15+中以-Werror的形式提供,-Xwerror也可以作为别名使用。

注意:我已经完全替换了原来的答案,因为我找到了一个更好的答案——它并不那么难看:

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!");
                }
            }
        }
    }

我只是想跟进一下,因为接受的答案在我使用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("nntERROR: You have compilation warnings!nn")
            }
        }
    }
}

最新更新