如何使用gradle使用Google Checkstyle规则编译项目



我正在尝试使用Google检查样式配置(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来构建这个项目。下面是我的成绩。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

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

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

享受吧!

问题在于com.puppycrawl.tools.checkstyle.checks.blocks.EmptyCatchBlockCheck确实被添加到了checkstyle中,但对于版本6.4-SNAPSHOT。正如在checkstyle存储库(pom.xml历史记录)中所看到的,版本6.4-SNAPSHOT于2015年2月2日引入,EmptyCatchBlockCheck类于2015年12月18日创建。

Gradle仍然使用6.3版本,如下日志摘录所示:

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

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

根据docs,checkstyle类路径可以用checkstyleClasspath属性指定——您可以尝试手动设置它。

我还准备了一个6.4-SNAPSHOT版本的演示,可以在这里找到。Checkstyle jar是用mvn clean package构建的,源代码取自此repo。

以下是一种适用于(当前)Gradle&棋盘格(6.1.1级和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文件,并且它将无法选择单个JAR文件。

最新更新