如何使用 gradle 使用 Google Checkstyle 规则编译项目?
How to compile project with Google Checkstyle rules with gradle?
我正在尝试使用 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
问题在于,com.puppycrawl.tools.checkstyle.checks.blocks.EmptyCatchBlockCheck
确实是添加到checkstyle中的,但是是针对6.4-SNAPSHOT版本的。从 checkstyle repository(pom.xml 历史记录)中可以看出,版本 6.4-SNAPSHOT 于 2015 年 2 月 2 日引入,EmptyCatchBlockCheck
class 于 2015 年 2 月 18 日创建。
Gradle 仍然使用 6.3 版,如下面的日志摘录:
:checkstyleMain
Download https://repo1.maven.org/maven2/com/puppycrawl/tools/checkstyle/6.3/checkstyle-6.3.pom
所以根本没有 class 您想使用。
根据 docs checkstyle class路径可以用 checkstyleClasspath
属性 指定 - 您可以尝试手动设置它。
我也准备了一个6.4-SNAPSHOT版本的demo,可以在here. Checkstyle jar was built with mvn clean package
with source taken from this repo中找到。
您可以将此配置添加到您的 build.gradle 文件中:
configurations {
checkstyleOverride
}
dependencies {
checkstyleOverride('com.puppycrawl.tools:checkstyle:6.11.2')
}
tasks.withType(Checkstyle) {
checkstyleClasspath = project.configurations.checkstyleOverride
}
尽情享受吧!
这是一种适用于(当前)最新版本 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 文件,并且无法 select 单个文件。
我正在尝试使用 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
问题在于,com.puppycrawl.tools.checkstyle.checks.blocks.EmptyCatchBlockCheck
确实是添加到checkstyle中的,但是是针对6.4-SNAPSHOT版本的。从 checkstyle repository(pom.xml 历史记录)中可以看出,版本 6.4-SNAPSHOT 于 2015 年 2 月 2 日引入,EmptyCatchBlockCheck
class 于 2015 年 2 月 18 日创建。
Gradle 仍然使用 6.3 版,如下面的日志摘录:
:checkstyleMain
Download https://repo1.maven.org/maven2/com/puppycrawl/tools/checkstyle/6.3/checkstyle-6.3.pom
所以根本没有 class 您想使用。
根据 docs checkstyle class路径可以用 checkstyleClasspath
属性 指定 - 您可以尝试手动设置它。
我也准备了一个6.4-SNAPSHOT版本的demo,可以在here. Checkstyle jar was built with mvn clean package
with source taken from this repo中找到。
您可以将此配置添加到您的 build.gradle 文件中:
configurations {
checkstyleOverride
}
dependencies {
checkstyleOverride('com.puppycrawl.tools:checkstyle:6.11.2')
}
tasks.withType(Checkstyle) {
checkstyleClasspath = project.configurations.checkstyleOverride
}
尽情享受吧!
这是一种适用于(当前)最新版本 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 文件,并且无法 select 单个文件。