【问题标题】:unable to get checkstyle working with gradle in intellij无法在 intellij 中与 gradle 一起使用 checkstyle
【发布时间】:2017-08-31 06:02:08
【问题描述】:

我的项目的 confg/checkstyle 目录中有以下 checkstyle.xml 文件。我正在使用 gradle (v3.4),其相关部分与我在运行 gradle build 时收到的错误消息一起复制如下(尚未设置 rootDir)。如何将 rootDir 传递给 checkstyle 插件?

错误

Execution failed for task ':checkstyleMain'.
> Unable to create a Checker: unable to read /abc/def/ghi/jkl/config/checkstyle/checkstyle.xml - unable to parse configuration stream - Property ${rootDir} has not been set

build.gradle

apply plugin: 'checkstyle'

//tried with and without the below
checkstyle {  
    ignoreFailures = true
    configFile = file("config/checkstyle/checkstyle.xml")
}

checkstyle.xml

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<!--
    Checkstyle configuration that checks the Google coding conventions from Google Java Style
    that can be found at https://google.github.io/styleguide/javaguide.html.

    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.sf.net (or in your downloaded distribution).

    To completely disable a check, just comment it out or delete it from the file.

    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
 -->

<module name = "Checker">
    <property name="charset" value="UTF-8"/>

    <property name="severity" value="error"/>

    <module name="Header">
        <property name="headerFile" value="${rootDir}/checkstyle.license"/>
        <property name="ignoreLines" value="2"/>
        <property name="fileExtensions" value="java"/>
    </module>

    <property name="fileExtensions" value="java, properties, xml"/>
    <!-- Checks for whitespace                               -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <module name="TreeWalker">
        <module name="OuterTypeFilename"/>
        <module name="IllegalTokenText">
            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
            <property name="format" value="\\u00(08|09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
            <property name="message" value="Avoid using corresponding octal or Unicode escape."/>
        </module>
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowEscapesForControlCharacters" value="true"/>
            <property name="allowByTailComment" value="true"/>
            <property name="allowNonPrintableEscapes" value="true"/>
        </module>
        <module name="LineLength">
            <property name="max" value="100"/>
            <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
        </module>
        <module name="AvoidStarImport"/>
        <!-- TODO(ejona): Upstream? -->
        <module name="UnusedImports"/>
        <module name="OneTopLevelClass"/>
        <module name="NoLineWrap"/>
        <module name="EmptyBlock">
            <property name="option" value="TEXT"/>
            <property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
        </module>
        <module name="NeedBraces"/>
        <module name="LeftCurly">
            <property name="maxLineLength" value="100"/>
        </module>
        <module name="RightCurly"/>
        <module name="RightCurly">
            <property name="option" value="alone"/>
            <property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
        </module>
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
            <property name="allowEmptyTypes" value="true"/>
            <property name="allowEmptyLoops" value="true"/>
            <message key="ws.notFollowed"
                     value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
            <message key="ws.notPreceded"
                     value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="OneStatementPerLine"/>
        <module name="MultipleVariableDeclarations"/>
        <module name="ArrayTypeStyle"/>
        <module name="MissingSwitchDefault"/>
        <module name="FallThrough"/>
        <module name="UpperEll"/>
        <module name="ModifierOrder"/>
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
        </module>
        <module name="SeparatorWrap">
            <property name="tokens" value="DOT"/>
            <property name="option" value="nl"/>
        </module>
        <module name="SeparatorWrap">
            <property name="tokens" value="COMMA"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern"
                     value="Package name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="TypeName">
            <message key="name.invalidPattern"
                     value="Type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MemberName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ParameterName">
            <!-- TODO(ejona): too strict, as one-character parameter names are permitted
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/-->
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="CatchParameterName">
            <!-- TODO(ejona): too strict, as one-character parameter names are permitted.
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/-->
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="LocalVariableName">
            <property name="tokens" value="VARIABLE_DEF"/>
            <!-- TODO(ejona): too strict, as one-character parameter names are permitted.
                 Add support for Unicode.
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/-->
            <property name="format" value="^[^A-Z]"/>
            <property name="allowOneCharVarInForLoop" value="true"/>
            <message key="name.invalidPattern"
                     value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Class type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Method type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="InterfaceTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Interface type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="NoFinalizer"/>
        <module name="GenericWhitespace">
            <message key="ws.followed"
                     value="GenericWhitespace ''{0}'' is followed by whitespace."/>
            <message key="ws.preceded"
                     value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
            <message key="ws.illegalFollow"
                     value="GenericWhitespace ''{0}'' should followed by whitespace."/>
            <message key="ws.notPreceded"
                     value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="Indentation">
            <property name="basicOffset" value="2"/>
            <property name="braceAdjustment" value="0"/>
            <property name="caseIndent" value="2"/>
            <property name="throwsIndent" value="4"/>
            <property name="lineWrappingIndentation" value="4"/>
            <property name="arrayInitIndent" value="2"/>
        </module>
        <module name="AbbreviationAsWordInName">
            <property name="ignoreFinal" value="false"/>
            <property name="allowedAbbreviationLength" value="1"/>
        </module>
        <module name="OverloadMethodsDeclarationOrder"/>
        <!-- TODO(ejona): Does not consider assignment during declaration as a usage.
        <module name="VariableDeclarationUsageDistance"/-->
        <module name="CustomImportOrder">
            <property name="specialImportsRegExp" value="com.google"/>
            <property name="sortImportsInGroupAlphabetically" value="true"/>
            <property name="customImportOrderRules" value="STATIC###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE"/>
        </module>
        <module name="MethodParamPad"/>
        <module name="OperatorWrap">
            <property name="option" value="NL"/>
            <property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
        </module>
        <module name="AnnotationLocation">
            <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
        </module>
        <module name="AnnotationLocation">
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="allowSamelineMultipleAnnotations" value="true"/>
        </module>
        <module name="NonEmptyAtclauseDescription"/>
        <module name="JavadocTagContinuationIndentation"/>
        <module name="SummaryJavadoc">
            <property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
        </module>
        <module name="JavadocParagraph"/>
        <module name="AtclauseOrder">
            <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
            <property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
        </module>
        <module name="JavadocMethod">
            <property name="scope" value="public"/>
            <property name="allowMissingParamTags" value="true"/>
            <property name="allowMissingThrowsTags" value="true"/>
            <property name="allowMissingReturnTag" value="true"/>
            <property name="minLineCount" value="2"/>
            <!-- TOOD(ejona): Too restrictive for tests
            <property name="allowedAnnotations" value="Override, Test"/-->
            <property name="allowedAnnotations" value="Override, Test, Before, After, BeforeClass, AfterClass, Setup, TearDown"/>
            <property name="allowThrowsTagsForSubclasses" value="true"/>
        </module>
        <module name="MethodName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
                     value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="SingleLineJavadoc">
            <!-- TODO(ejona): Based on mis-reading of style; consider upstreaming
            <property name="ignoreInlineTags" value="false"/-->
        </module>
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected"/>
        </module>
        <module name="CommentsIndentation"/>
    </module>
</module>

【问题讨论】:

    标签: gradle checkstyle gradle-plugin


    【解决方案1】:

    我只是替换了 checkstyle.xml 文件(它不需要在 xml 文件中使用 rootDir。现在运行 gradle build 可以很好地使用 checkstyle。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
    
    <!-- This is a checkstyle configuration file. For descriptions of
    what the following rules do, please see the checkstyle configuration
    page at http://checkstyle.sourceforge.net/config.html -->
    
    <module name="Checker">
    
      <module name="FileTabCharacter">
        <!-- Checks that there are no tab characters in the file.
        -->
      </module>
    
      <module name="NewlineAtEndOfFile">
        <property name="lineSeparator" value="lf"/>
      </module>
    
      <module name="RegexpSingleline">
        <!-- Checks that FIXME is not used in comments.  TODO is preferred.
        -->
        <property name="format" value="((//.*)|(\*.*))FIXME" />
        <property name="message" value='TODO is preferred to FIXME.  e.g. "TODO(johndoe): Refactor when v2 is released."' />
      </module>
    
      <module name="RegexpSingleline">
        <!-- Checks that TODOs are named.  (Actually, just that they are followed
             by an open paren.)
        -->
        <property name="format" value="((//.*)|(\*.*))TODO[^(]" />
        <property name="message" value='All TODOs should be named.  e.g. "TODO(johndoe): Refactor when v2 is released."' />
      </module>
    
      <module name="JavadocPackage">
        <!-- Checks that each Java package has a Javadoc file used for commenting.
          Only allows a package-info.java, not package.html. -->
      </module>
    
      <!-- All Java AST specific tests live under TreeWalker module. -->
      <module name="TreeWalker">
    
        <!--
        IMPORT CHECKS
        -->
    
        <module name="RedundantImport">
          <!-- Checks for redundant import statements. -->
          <property name="severity" value="error"/>
        </module>
    
        <module name="ImportOrder">
          <!-- Checks for out of order import statements. -->
    
          <property name="severity" value="warning"/>
          <property name="groups" value="com.google,android,junit,net,org,java,javax"/>
          <!-- This ensures that static imports go first. -->
          <property name="option" value="top"/>
          <property name="tokens" value="STATIC_IMPORT, IMPORT"/>
        </module>
    
        <!--
        JAVADOC CHECKS
        -->
    
        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <module name="JavadocMethod">
          <property name="scope" value="protected"/>
          <property name="severity" value="warning"/>
          <property name="allowMissingJavadoc" value="true"/>
          <property name="allowMissingParamTags" value="true"/>
          <property name="allowMissingReturnTag" value="true"/>
          <property name="allowMissingThrowsTags" value="true"/>
          <property name="allowThrowsTagsForSubclasses" value="true"/>
          <property name="allowUndeclaredRTE" value="true"/>
        </module>
    
        <module name="JavadocType">
          <property name="scope" value="protected"/>
          <property name="severity" value="error"/>
        </module>
    
        <module name="JavadocStyle">
          <property name="severity" value="warning"/>
        </module>
    
        <!--
        NAMING CHECKS
        -->
    
        <!-- Item 38 - Adhere to generally accepted naming conventions -->
    
        <module name="PackageName">
          <!-- Validates identifiers for package names against the
            supplied expression. -->
          <!-- Here the default checkstyle rule restricts package name parts to
            seven characters, this is not in line with common practice at Google.
          -->
          <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]{1,})*$"/>
          <property name="severity" value="warning"/>
        </module>
    
        <module name="TypeNameCheck">
          <!-- Validates static, final fields against the
          expression "^[A-Z][a-zA-Z0-9]*$". -->
          <metadata name="altname" value="TypeName"/>
          <property name="severity" value="warning"/>
        </module>
    
        <module name="ConstantNameCheck">
          <!-- Validates non-private, static, final fields against the supplied
          public/package final fields "^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$". -->
          <metadata name="altname" value="ConstantName"/>
          <property name="applyToPublic" value="true"/>
          <property name="applyToProtected" value="true"/>
          <property name="applyToPackage" value="true"/>
          <property name="applyToPrivate" value="false"/>
          <property name="format" value="^([A-Z][A-Z0-9]*(_[A-Z0-9]+)*|FLAG_.*)$"/>
          <message key="name.invalidPattern"
                   value="Variable ''{0}'' should be in ALL_CAPS (if it is a constant) or be private (otherwise)."/>
          <property name="severity" value="warning"/>
        </module>
    
        <module name="StaticVariableNameCheck">
          <!-- Validates static, non-final fields against the supplied
          expression "^[a-z][a-zA-Z0-9]*_?$". -->
          <metadata name="altname" value="StaticVariableName"/>
          <property name="applyToPublic" value="true"/>
          <property name="applyToProtected" value="true"/>
          <property name="applyToPackage" value="true"/>
          <property name="applyToPrivate" value="true"/>
          <property name="format" value="^[a-z][a-zA-Z0-9]*_?$"/>
          <property name="severity" value="warning"/>
        </module>
    
        <module name="MemberNameCheck">
          <!-- Validates non-static members against the supplied expression. -->
          <metadata name="altname" value="MemberName"/>
          <property name="applyToPublic" value="true"/>
          <property name="applyToProtected" value="true"/>
          <property name="applyToPackage" value="true"/>
          <property name="applyToPrivate" value="true"/>
          <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
          <property name="severity" value="warning"/>
        </module>
    
        <module name="MethodNameCheck">
          <!-- Validates identifiers for method names. -->
          <metadata name="altname" value="MethodName"/>
          <property name="format" value="^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$"/>
          <property name="severity" value="warning"/>
        </module>
    
        <module name="ParameterName">
          <!-- Validates identifiers for method parameters against the
            expression "^[a-z][a-zA-Z0-9]*$". -->
          <property name="severity" value="warning"/>
        </module>
    
        <module name="LocalFinalVariableName">
          <!-- Validates identifiers for local final variables against the
            expression "^[a-z][a-zA-Z0-9]*$". -->
          <property name="severity" value="warning"/>
        </module>
    
        <module name="LocalVariableName">
          <!-- Validates identifiers for local variables against the
            expression "^[a-z][a-zA-Z0-9]*$". -->
          <property name="severity" value="warning"/>
        </module>
    
    
        <!--
        LENGTH and CODING CHECKS
        -->
    
        <module name="LineLength">
          <!-- Checks if a line is too long. -->
          <property name="max" value="${com.puppycrawl.tools.checkstyle.checks.sizes.LineLength.max}" default="100"/>
          <property name="severity" value="error"/>
    
          <!--
            The default ignore pattern exempts the following elements:
              - import statements
              - long URLs inside comments
          -->
    
          <property name="ignorePattern"
              value="${com.puppycrawl.tools.checkstyle.checks.sizes.LineLength.ignorePattern}"
              default="^(package .*;\s*)|(import .*;\s*)|( *(\*|//).*https?://.*)$"/>
        </module>
    
        <module name="LeftCurly">
          <!-- Checks for placement of the left curly brace ('{'). -->
          <property name="severity" value="warning"/>
        </module>
    
        <module name="RightCurly">
          <!-- Checks right curlies on CATCH, ELSE, and TRY blocks are on
          the same line. e.g., the following example is fine:
          <pre>
            if {
              ...
            } else
          </pre>
          -->
          <!-- This next example is not fine:
          <pre>
            if {
              ...
            }
            else
          </pre>
          -->
          <property name="option" value="same"/>
          <property name="severity" value="warning"/>
        </module>
    
        <!-- Checks for braces around if and else blocks -->
        <module name="NeedBraces">
          <property name="severity" value="warning"/>
          <property name="tokens" value="LITERAL_IF, LITERAL_ELSE, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO"/>
        </module>
    
        <module name="UpperEll">
          <!-- Checks that long constants are defined with an upper ell.-->
          <property name="severity" value="error"/>
        </module>
    
        <module name="FallThrough">
          <!-- Warn about falling through to the next case statement.  Similar to
          javac -Xlint:fallthrough, but the check is suppressed if a single-line comment
          on the last non-blank line preceding the fallen-into case contains 'fall through' (or
          some other variants which we don't publicized to promote consistency).
          -->
          <property name="reliefPattern"
           value="fall through|Fall through|fallthru|Fallthru|falls through|Falls through|fallthrough|Fallthrough|No break|NO break|no break|continue on"/>
          <property name="severity" value="error"/>
        </module>
    
    
        <!--
        MODIFIERS CHECKS
        -->
    
        <module name="ModifierOrder">
          <!-- Warn if modifier order is inconsistent with JLS3 8.1.1, 8.3.1, and
               8.4.3.  The prescribed order is:
               public, protected, private, abstract, static, final, transient, volatile,
               synchronized, native, strictfp
            -->
        </module>
    
    
        <!--
        WHITESPACE CHECKS
        -->
    
        <module name="WhitespaceAround">
          <!-- Checks that various tokens are surrounded by whitespace.
               This includes most binary operators and keywords followed
               by regular or curly braces.
          -->
          <property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR,
            BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN,
            EQUAL, GE, GT, LAND, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
            LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
            LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS,
            MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION,
            SL, SL_ASSIGN, SR_ASSIGN, STAR, STAR_ASSIGN"/>
          <property name="severity" value="error"/>
        </module>
    
        <module name="WhitespaceAfter">
          <!-- Checks that commas, semicolons and typecasts are followed by
               whitespace.
          -->
          <property name="tokens" value="COMMA, SEMI, TYPECAST"/>
        </module>
    
        <module name="NoWhitespaceAfter">
          <!-- Checks that there is no whitespace after various unary operators.
               Linebreaks are allowed.
          -->
          <property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS,
            UNARY_PLUS"/>
          <property name="allowLineBreaks" value="true"/>
          <property name="severity" value="error"/>
        </module>
    
        <module name="NoWhitespaceBefore">
          <!-- Checks that there is no whitespace before various unary operators.
               Linebreaks are allowed.
          -->
          <property name="tokens" value="SEMI, DOT, POST_DEC, POST_INC"/>
          <property name="allowLineBreaks" value="true"/>
          <property name="severity" value="error"/>
        </module>
    
        <module name="ParenPad">
          <!-- Checks that there is no whitespace before close parens or after
               open parens.
          -->
          <property name="severity" value="warning"/>
        </module>
    
      </module>
    </module>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2018-08-17
      • 2014-01-20
      • 2015-12-03
      • 2019-02-22
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多