环境
IDEA:2020.3
Java:1.8
checkstyle:8.40+
checkstyle plugin:3.1.2
maven pom
先在项目顶层的pom
文件中的<build>/<plugins>
下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
<!--因为maven-checkstyle-plugin3.1.2默认是8.29,所以得指定下-->
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>8.41.1</version>
</dependency>
</dependencies>
<configuration>
<!--注意这里,就是指的checkstyle.xml文件路径-->
<configLocation>checkstyle.xml</configLocation>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
</configuration>
<!--和maven的生命周期进行绑定;executions:执行的意思-->
<executions>
<execution>
<id>validate</id>
<!--阶段:mavenvalidate阶段执行校验-->
<phase>validate</phase>
<goals>
<!--执行checkstyle的check任务-->
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
checkstyle.xml文件
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="charset" value="UTF-8" />
<property name="fileExtensions" value="java, properties" />
<property name="localeCountry" value="CN" />
<property name="localeLanguage" value="zh" />
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="^(module|package)\-info\.java$" />
</module>
<module name="SuppressWarningsFilter" />
<!--排除不需要扫描的路径-->
<module name="SuppressionFilter">
<property name="file" value="suppressions.xml"/>
</module>
<module name="NewlineAtEndOfFile" />
<module name="FileTabCharacter">
<property name="eachLine" value="true" />
</module>
<module name="FileLength">
<property name="max" value="1500" />
</module>
<module name="LineLength">
<property name="fileExtensions" value="java" />
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://" />
<property name="max" value="120" />
</module>
<module name="TreeWalker">
<!-- https://checkstyle.org/config_annotation.html -->
<module name="SuppressWarningsHolder" />
<module name="MissingOverride" />
<!-- https://checkstyle.org/config_blocks.html -->
<module name="AvoidNestedBlocks" />
<module name="EmptyBlock">
<property name="option" value="text" />
</module>
<module name="EmptyCatchBlock" />
<module name="NeedBraces" />
<module name="LeftCurly" />
<module name="RightCurly">
<property name="id" value="RightCurlySame" />
<property name="option" value="same" />
<property name="tokens" value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO" />
</module>
<module name="RightCurly">
<property name="id" value="RightCurlyAlone" />
<property name="option" value="alone" />
<property name="tokens" value="CLASS_DEF , METHOD_DEF , CTOR_DEF , LITERAL_FOR , LITERAL_WHILE , STATIC_INIT , INSTANCE_INIT , ANNOTATION_DEF , ENUM_DEF" />
</module>
<!-- https://checkstyle.org/config_design.html -->
<module name="FinalClass" />
<module name="InterfaceIsType" />
<module name="VisibilityModifier">
<property name="packageAllowed" value="true" />
<property name="protectedAllowed" value="true" />
</module>
<!-- https://checkstyle.org/config_coding.html -->
<module name="DefaultComesLast" />
<module name="EmptyStatement" />
<module name="EqualsAvoidNull" />
<module name="EqualsHashCode" />
<module name="FallThrough" />
<module name="HiddenField">
<property name="tokens" value="VARIABLE_DEF" />
<message key="hidden.field" value="局部变量 ''{0}'' 的名字不能和成员变量相同(方法参数/lambda参数 除外)"/>
</module>
<module name="InnerAssignment" />
<module name="MagicNumber">
<property name="ignoreAnnotation" value="true" />
<property name="ignoreHashCodeMethod" value="true" />
<property name="ignoreAnnotationElementDefaults" value="true" />
</module>
<module name="MissingSwitchDefault" />
<module name="NestedForDepth">
<property name="max" value="2" />
<message key="nested.for.depth" value="除最外层for,至多允许嵌套{1,number,integer}层 ,目前{0,number,integer}层" />
</module>
<module name="NestedIfDepth">
<property name="max" value="2" />
<message key="nested.if.depth" value="除最外层if,至多允许嵌套{1,number,integer}层 ,目前{0,number,integer}层" />
</module>
<module name="NestedTryDepth">
<property name="max" value="2" />
<message key="nested.try.depth" value="除最外层if,至多允许嵌套{1,number,integer}层 ,目前{0,number,integer}层" />
</module>
<module name="OneStatementPerLine" />
<module name="SimplifyBooleanExpression" />
<module name="SimplifyBooleanReturn" />
<module name="StringLiteralEquality" />
<module name="SuperClone" />
<module name="SuperFinalize" />
<!-- https://checkstyle.org/config_imports.html -->
<module name="IllegalImport" />
<module name="RedundantImport" />
<module name="UnusedImports" />
<!-- https://checkstyle.org/config_javadoc.html -->
<!-- 暂时去掉
<module name="MissingJavadocMethod">
<property name="allowedAnnotations" value="Override, Test" />
<property name="allowMissingPropertyJavadoc" value="true" />
<message key="javadoc.missing" value="除@Override/@Test/getter/setter外,所有公有方法/构造方法/注解属性,都必须要有注释" />
</module>
-->
<!-- https://checkstyle.org/config_misc.html -->
<module name="ArrayTypeStyle" />
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="4"/>
<property name="throwsIndent" value="4"/>
<property name="arrayInitIndent" value="4"/>
<property name="lineWrappingIndentation" value="8"/>
</module>
<module name="UncommentedMain">
<property name="excludedClasses" value=".*Application$" />
</module>
<module name="UpperEll" />
<!-- https://checkstyle.org/config_modifier.html -->
<module name="ModifierOrder" />
<module name="RedundantModifier" />
<!-- https://checkstyle.org/config_naming -->
<module name="AbstractClassName">
<property name="format" value="^(Abstract|Base)[A-Z][a-zA-Z0-9]*$" />
<property name="ignoreModifier" value="true" />
<message key="name.invalidPattern" value="抽象类命名使用Abstract或Base开头" />
</module>
<module name="CatchParameterName" />
<module name="ClassTypeParameterName" />
<module name="ConstantName" />
<module name="InterfaceTypeParameterName" />
<module name="LambdaParameterName" />
<module name="LocalFinalVariableName" />
<module name="LocalVariableName" />
<module name="MemberName" />
<module name="MethodName">
<property name="format" value="^[_a-z]([a-zA-Z0-9]+)*$" />
</module>
<module name="MethodTypeParameterName" />
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
</module>
<module name="ParameterName">
<property name="ignoreOverridden" value="true" />
</module>
<module name="StaticVariableName" />
<module name="TypeName">
<property name="severity" value="warning" />
</module>
<!-- https://checkstyle.org/config_regexp.html -->
<module name="Regexp">
<property name="format" value="System\.out\.println" />
<property name="illegalPattern" value="true" />
</module>
<!-- https://checkstyle.org/config_sizes.html -->
<module name="MethodLength">
<property name="tokens" value="METHOD_DEF" />
<property name="max" value="80" />
</module>
<module name="ParameterNumber">
<property name="tokens" value="METHOD_DEF" />
<property name="max" value="5" />
</module>
<!-- https://checkstyle.org/config_whitespace.html -->
<module name="EmptyLineSeparator">
<property name="tokens"
value="IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF, STATIC_INIT, INSTANCE_INIT,
METHOD_DEF, CTOR_DEF, VARIABLE_DEF, RECORD_DEF, COMPACT_CTOR_DEF"/>
<property name="allowNoEmptyLineBetweenFields" value="true"/>
<property name="allowMultipleEmptyLines" value="false"/>
<property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>
</module>
<module name="GenericWhitespace" />
<module name="MethodParamPad" />
<module name="NoLineWrap" />
<module name="NoWhitespaceAfter" />
<module name="NoWhitespaceBefore" />
<module name="OperatorWrap" />
<module name="ParenPad" />
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapNL" />
<property name="tokens" value="DOT" />
<property name="option" value="nl" />
</module>
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapEOL" />
<property name="tokens" value="COMMA, ELLIPSIS, ARRAY_DECLARATOR" />
<property name="option" value="EOL" />
</module>
<module name="TypecastParenPad" />
<module name="WhitespaceAfter" />
<module name="WhitespaceAround" />
</module>
</module>
suppressions.xml
配置不需要扫描的路径
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<suppressions>
<suppress files="[\\/]com[\\/]sgy[\\/]ssm[\\/]" checks="[a-zA-Z0-9]*"/>
<suppress files="[\\/]resources[\\/]" checks="[a-zA-Z0-9]*"/>
<suppress files=".*(Switch|Enum|ErrorCode).java" checks="[a-zA-Z0-9]*"/>
</suppressions>
我们可以先本地验证下,执行maven插件任务:
也可以命令行里执行:
mvn clean compile
如果执行验证代码:
mvn clean validate
--------------------2021年05月18号---------------start----------
今天引入一个项目时(我组核心项目),却发现在compile
阶段经常报错:
[ERROR] COMPILATION ERROR :
cannot find symbol
symbol: class XXX
看了下,报错的那个模块,全是第三方引用;神奇的是,我修改下pom(比如调整下checkstyle
插件的位置),然后让AONE
,再打包编译,第一次,没问题,然后进行第二次打包编译测试时,就又出现 compilation error错误。
后面做了下调整:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<!--注意这里,就是指的checkstyle.xml文件路径-->
<configLocation>checkstyle.xml</configLocation>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
</configuration>
<executions>
<execution>
<!--注意这里,修改了绑定maven的生命周期的阶段-->
<id>verify-style</id>
<phase>process-classes</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
这样修改后,测试了3次,不会在报compilation error错误了。后面再观察观察。
排除不需要扫描的包
附录
maven生命周期
default生命周期是最核心的,它包含了构建项目时真正需要执行的所有步骤。
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources :复制和处理资源文件到target目录,准备打包;
- compile :编译项目的源代码;
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile :编译测试源代码;
- process-test-classes
- test :运行测试代码;
- prepare-package
- package :打包成jar或者war或者其他格式的分发包;
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install :将打好的包安装到本地仓库,供其他项目使用;
- deploy :将打好的包安装到远程仓库,供其他项目使用;
--------------------2021年05月18号---------------end----------
参考地址: