【问题标题】:How to compile project with Google Checkstyle rules with gradle?如何使用带有 gradle 的 Google Checkstyle 规则编译项目?
【发布时间】:2015-04-29 06:20:08
【问题描述】:

我正在尝试使用 Google checkstyle 配置 (https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml),但我在 gradle check 上经常遇到错误:

Unable to create a Checker: cannot initialize module TreeWalker - Unable to instantiate EmptyCatchBlock

我使用 Gradle 来构建项目。下面是我的 gradle.build。

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'checkstyle'

sourceCompatibility = 1.8
version = '1.0'

checkstyle {
    toolVersion = "6.3"
}

task "create-dirs" << {
   sourceSets*.java.srcDirs*.each { it.mkdirs() }
   sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

jar {
    manifest {
        attributes 'Implementation-Title': 'xyz',
                   'Implementation-Version': 0.01
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile (
        ['org.apache.logging.log4j:log4j-api:2.2'],
        ['org.apache.logging.log4j:log4j-core:2.2']
    )
    testCompile(
        ['junit:junit:4.11'],
        ['org.mockito:mockito-core:1.+']
    )
}

test {
    systemProperties 'property': 'value'
}

uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}

另外,当我尝试将 XML 配置文件添加到 IDEA 中的 Checkstyle 插件时,我得到了类似的错误,但有一个堆栈跟踪:

org.infernus.idea.checkstyle.exception.CheckStylePluginException: <html><b>The CheckStyle rules file could not be loaded.</b><br>cannot initialize module TreeWalker - Unable to instantiate EmptyCatchBlock</html>
    at org.infernus.idea.checkstyle.checker.CheckerFactory.blacklistAndShowMessage(CheckerFactory.java:234)
    at org.infernus.idea.checkstyle.checker.CheckerFactory.createChecker(CheckerFactory.java:188)
    at org.infernus.idea.checkstyle.checker.CheckerFactory.getOrCreateCachedChecker(CheckerFactory.java:98)
    at org.infernus.idea.checkstyle.checker.CheckerFactory.getChecker(CheckerFactory.java:73)
    at org.infernus.idea.checkstyle.checker.CheckerFactory.getChecker(CheckerFactory.java:41)

我无法弄清楚我做错了什么。任何帮助,将不胜感激。 Gradle 版本:2.2

【问题讨论】:

    标签: java gradle checkstyle


    【解决方案1】:

    您可以将此配置添加到您的 build.gradle 文件中:

    configurations {
      checkstyleOverride
    }
    
    dependencies {
      checkstyleOverride('com.puppycrawl.tools:checkstyle:6.11.2')
    }
    
    tasks.withType(Checkstyle) {
      checkstyleClasspath = project.configurations.checkstyleOverride
    }
    

    享受吧!

    【讨论】:

    • checkstyle,不是checksytle ;)
    【解决方案2】:

    问题在于 com.puppycrawl.tools.checkstyle.checks.blocks.EmptyCatchBlockCheck 确实被添加到 checkstyle 但版本 6.4-SNAPSHOT。正如在 checkstyle repository(pom.xml 历史)中可以看到的那样,版本 6.4-SNAPSHOT 是在 2015 年 2 月 2 日引入的,EmptyCatchBlockCheck 类是在 2015 年 2 月 18 日创建的。

    Gradle 仍然使用 6.3 版,如以下日志提取:

    :checkstyleMain
    Download https://repo1.maven.org/maven2/com/puppycrawl/tools/checkstyle/6.3/checkstyle-6.3.pom
    

    所以根本没有你想使用的类。

    根据docs checkstyle classpath可以用checkstyleClasspath属性指定——你可以尝试手动设置。

    我还准备了一个6.4-SNAPSHOT版本的demo,可以在here找到。 Checkstyle jar 是使用 mvn clean package 构建的,源代码取自 this repo。

    【讨论】:

      【解决方案3】:

      这是一种适用于(当前)最新版本的 Gradle 和 Checkstyle(Gradle 6.1.1 和 Checkstyle 8.29)的方法:

      plugins {
          id 'java'
          id 'checkstyle'
      }
      
      configurations {
          checkstyleConfig
      }
      
      dependencies {
          checkstyleConfig("com.puppycrawl.tools:checkstyle:8.29") { transitive = false }
      }
      
      checkstyle {
          toolVersion '8.29'
          config = resources.text.fromArchiveEntry(configurations.checkstyleConfig, 'google_checks.xml')
      }
      

      请注意,Checkstyle 依赖不包括传递依赖,否则resources.text.fromArchiveEntry 将失败,因为将存在多个 JAR 文件,并且无法选择单个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        相关资源
        最近更新 更多