【问题标题】:Checkstyle, Unable to create Root ModuleCheckstyle,无法创建根模块
【发布时间】:2018-09-13 16:04:18
【问题描述】:

我正在尝试在项目中配置 Checkstyle。我添加了:

    apply plugin: 'checkstyle'
    checkstyle {
        // assign the latest checkstyle version explicitly
        // default version is very old, likes 5.9
        toolVersion = '8.6'
        // checkstyle.xml copy from:
        // https://raw.githubusercontent.com/checkstyle/checkstyle/checkstyle-8.6/src/main/resources/google_checks.xml
        // the version should be as same as plugin version
        configFile = rootProject.file('config/checkstyle/checkstyle.xml')
    }
    task Checkstyle(type: Checkstyle) {
        source 'src/main/java'
        include '**/*.java'
        exclude '**/gen/**'
        exclude '**/R.java'
        exclude '**/BuildConfig.java'

        // empty classpath
        classpath = rootProject.files()
    }

allprojects 中的我的根 gradle 文件。

但是当我运行./gradlew checkstyle

我明白了:

* What went wrong:
Execution failed for task ':app:Checkstyle'.
> Unable to create Root Module: config {/Users/user/Development/project/config/checkstyle/checkstyle.xml}, classpath {null}.

即使是带有规则的文件也位于指定的目录中。

【问题讨论】:

  • 这可能是classpath 行,您应该删除它。但更好的是,组织您的代码,以便您的真实代码(您想要检查的)位于 SourceSet 中(例如main)。那么你根本不需要创建任务,因为 Checkstyle 插件已经为你创建了完美的任务。
  • 删除类路径会产生不同的错误:> 没有为属性“类路径”指定值。

标签: android checkstyle


【解决方案1】:

问题是它找不到规则文件。所以我改变了:

configFile = rootProject.file('config/checkstyle/checkstyle.xml')

到:

configFile = file("${rootDir}/config/checkstyle/checkstyle.xml")

现在它可以正确拾取它了。

【讨论】:

  • 这是唯一对我有用的解决方案。该应用程序的 checkstyle.xml 位于子目录中。一旦我将它移回项目根目录中的 /config/checkstyle/ ,它就可以工作了。
  • (拼写错误)从您的答案中的 ckeckstyle.xml 更改为 checkstyle.xml。
【解决方案2】:

对我来说,由于 java 版本不匹配而失败。

我正在运行java 11,但在build.gradle sourceCompatibility = 1.8

一旦我切换到 java 1.8,它就可以正常工作了。

【讨论】:

    【解决方案3】:

    来自version 8.24的发行说明:

    将 LineLength Check 父级从 TreeWalker 更改为 Checker。

    所以我不得不搬家

    <module name="LineLength">

    从内部

    <module name="TreeWalker">

    到里面

    <module name="Checker">

    【讨论】:

    • 我在 java 8 和 gradle 4.4 中有一个项目,想更改为 java 11 和 gradle 6,所以这是帮助我编译的配置 :) 谢谢!
    【解决方案4】:

    我看到这个问题以不同的维度提出(在 SO 和 github 上都提出过),这里是我发现的摘要。

    我假设checkstyle.xml 的位置不是这里的问题。在浏览此解决方案之前,我建议您查看其他有关如何解决该问题的答案。最快的验证方法是把这个打印语句放在你的一个任务中并运行它(任务)

    println(file("${rootDir.projectDir}/path/to/checkstyle.xml"))

    确保它在控制台中打印的路径正确/有效。如果它是正确的路径,但您仍然看到错误,那么您有不同的问题;继续以下场景:

    • 如果您像这样在 Gradle 中添加 checkstyle 插件(我使用的是 Gradle >= 4.0):
    plugins {
    id 'checkstyle'
    }
    

    默认的 checkstyle 版本将用于该版本的 Gradle。 Gradle 版本与默认检查样式插件版本的另一个兼容性矩阵HERE

    • 如果您想指定插件使用的checkstyle.xml,您需要记住这一点 - 插件版本与兼容checkstyle.xml 版本的矩阵。对于谷歌检查风格,我发现最好的方法是检查插件版本。例如,如果我想在我的项目中使用版本 8.2,它的 build.gradle 条目将如下所示:
    plugins {
    id 'checkstyle'
    }
    
    checkstyle {
      project.ext.checkstyleVersion = '8.20'
    }
    
    

    这将自动使用(拉)与指定版本(即 8.20)兼容的checkstyle.xml

    • 如果您想自定义(添加/删除)一些检查样式规则,我建议您从(编辑)兼容版本开始。 要了解与此插件版本兼容的 checkstyle.xml 版本,请转到 Github 上的 Google Checkstyle releases 并下载 8.20 release zip 或 tar。 解压后,在src/main/resources/ 目录中找到google(或sun)checkstyle xml。根据需要自定义 xml 后,您的 build.gradle 条目将如下所示
    
    plugins {
    id 'checkstyle'
    }
    
    checkstyle {
      project.ext.checkstyleVersion = '8.20'
      configFile = file("${rootDir.projectDir}/path/to/google_checks.xml")
    }
    

    希望您不会再看到该错误。

    【讨论】:

      【解决方案5】:

      这个问题也可能是由于您在 checkstyle 配置中使用了过时的 api。请参阅此链接 herehere

      【讨论】:

        【解决方案6】:

        当我将 Android Gradle 插件更新到 3.3.0 时发生这种情况

        请运行:

        ./gradlew checkstyle --stacktrace

        您可能需要检查您的 checkstyle.xml 配置文件。

        我需要移动这两个标签:

         <module name="SuppressionCommentFilter"/>
        
                <!--Enable usage SUPPRESS CHECKSTYLE comment-->
                <module name="SuppressWithNearbyCommentFilter">
                    <property name="commentFormat" value="CHECKSTYLE IGNORE"/>
                    <property name="checkFormat" value=".*"/>
                    <property name="influenceFormat" value="0"/>
                </module>
        

        里面

        <module name="TreeWalker"> 
        

        标签

        我还需要删除:

        <module name="SuppressionCommentFilter"/>
        

        【讨论】:

        • 你是指 Gradle 还是 Android Gradle Plugin?我的 Gradle 版本在 4 以上。
        • Android Gradle 插件
        • 我在 3.3.0 发布之前遇到了这个问题,这是根本原因:stackoverflow.com/a/53328412/1048418
        • 是的,不仅可以查看 gradle 及其插件失败的位置,还可以查看 checkstyle 失败的位置,这非常有帮助。例如“...CheckstyleException...非法值...对于属性'headerFile'。
        • 对于那些使用 Java 11 或更高版本和 Unable to find: suppressions.xml 的用户:在 Checkstyle 配置中的抑制文件路径前添加 ${config_loc} 变量,例如:&lt;property name="file" value="${config_loc}/suppressions.xml"/&gt;。请参阅https://github.com/gradle/gradle/issues/8286 了解更多信息。
        【解决方案7】:

        我也有类似的问题和相同的异常消息。以下步骤解决了我的问题:

        将工具版本更新至 8.16。在我有 8.1 之前 我使用了 'configDir' 而不是 'configFile' 属性。

        configDir = file("$rootProject.projectDir/etc/checkstyle")
        

        以前是:

        configFile = file("$rootProject.projectDir/etc/checkstyle/checkstyle.xml")
        

        此外,我还有一个“reportDir”属性,它也被更改为指向目录而不是文件。

        reportsDir = file("$project.buildDir/reports/checkstyle")
        

        以前是:

        reportsDir = file("$project.buildDir/reports/checkstyle/checkstyle.xml")
        

        我正在使用 JDK 11,它可以使用它。

        【讨论】:

        • 我用过configDir = file("$rootProject.projectDir/config/checkstyle")
        【解决方案8】:

        我的问题是这个进程是从一个不同的目录运行的,而不是我想象的。

        即使我检查以确保 checkstyle.xml 确实存在于它显示的路径中,它仍然会中断,因为我的构建过程未能将 cd 到正确的目录来运行它!

        确保你在你认为的地方运行它!

        【讨论】:

          【解决方案9】:

          我有一个非常相似的问题,我基本上使用了@Bohemian 的答案。 checkStyle 找不到文件,所以我强行输入它想要的内容。就我而言,根本原因是 NetBeans 的 gradle 插件没有正确传播所有“环境”变量,因此对 ${basedir}/config/checkstyle/import-control.xml 的引用失败。当checkStyle 在NetBeans 中运行时,${basedir} 设置为$USER_HOME,而不是项目的根目录。作为一种解决方法,我将所需文件复制到我的主目录中,这样checkStyle 就可以正常运行。
          丑陋,但总比没有好。

          【讨论】:

            【解决方案10】:

            config/checkstyle/checkstyle.xml 包含对不存在文件的引用时,我收到此错误。就我而言,通过:

            <module name="SuppressionFilter">
                <property name="file" value="config/checkstyle/checkstyle-suppressions.xml"/> <!-- Oops: No such file! -->
            </module>
            

            创建文件config/checkstyle/checkstyle-suppressions.xml 解决了这个问题。

            如果有帮助,它的内容(与 checkstyle.xml 具有相同的标题)是:

            <suppressions>
                <suppress files="/generated/" checks="\w+"/>
                <suppress files="/test/" checks="\w+"/>
            </suppressions>
            

            【讨论】:

              【解决方案11】:

              每当无法读取配置文件时都会发生此错误。你确定你有一个/Users/user/Development/project/config/checkstyle/checkstyle.xml 文件吗?

              【讨论】:

                猜你喜欢
                • 2018-01-04
                • 1970-01-01
                • 2018-09-11
                • 2015-12-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-05-24
                相关资源
                最近更新 更多