【问题标题】:How to fail gradle build on Javadoc warnings如何在 Javadoc 警告上使 gradle 构建失败
【发布时间】:2015-06-13 16:09:01
【问题描述】:

我正在使用 Java 7(尽管使用 1.6 进行编译)来编译类和 javadocs。我已经消除了所有出现的 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 的控制台输出来抓取它?

【问题讨论】:

  • 可能问题是你正在配置gendocs任务,而使用java插件时默认生成它们的任务被命名为javadoc
  • 没有什么不同。我决定只实现 checkstyle。
  • 随时为这个discuss.gradle.org/t/javadoc-fail-on-warning/18141提供真正的解决方案@

标签: java gradle javadoc


【解决方案1】:

在所有受支持的 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。此功能现在在 JDK 15+ 中作为 -Werror 提供,-Xwerror 也可以作为别名使用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢你,它正在满足我现在的需要。
    • 我真的很想让这个工作,但我在构建过程中不断收到来自其他“警告:”字符串的太多误报。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我只是想跟进这一点,因为接受的答案在我使用 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")
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-27
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        • 2019-07-03
        相关资源
        最近更新 更多