给 maven 项目添加 Checkstyle 检查,提升代码规范

团队中每个人写代码的风格迥异,为了让大家提交上来的代码具有统一的风格,光靠嘴上说统一是没用的,还需借助工具。

Checkstyle 就是这样一个工具,可以做代码格式检查。它同时还提供 maven-checkstyle-plugin 插件,集成到我们的 maven 项目中,执行构建时自动做代码风格检查,如果有不规范的直接构建失败,这样保证出口的代码都是符合代码规范的。

下面就简单介绍 maven 项目中如何集成 Checkstyle 做代码规范:

编写规范配置文件

Checkstyle 可以配置很多规则,有些是必要的,有些我感觉太严格了。具体每条规则什么含义可以参考:https://checkstyle.org/checks.html

下面是我常用的配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?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="severity" value="error"/>
<!-- 需要检查的文件扩展名 -->
<property name="fileExtensions" value="java, properties, xml"/>

<!-- 文件是否包含制表符 -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>

<!-- 行长度 -->
<module name="LineLength">
<property name="fileExtensions" value="java"/>
<property name="max" value="200"/>
<property name="ignorePattern" value="^implements.*|^extends.*|^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>

<!-- property 文件中是否有相同的 key -->
<module name="Translation"/>

<!-- Java 源文件并定义一些适用于检查此类文件的一些属性 -->
<module name="TreeWalker">

<!-- 外部类型名称和文件名是否匹配 -->
<module name="OuterTypeFilename"/>
<module name="PackageName" />
<module name="TypeName"/>
<module name="MemberName"/>
<module name="ParameterName"/>
<module name="LambdaParameterName"/>
<module name="CatchParameterName"/>
<module name="LocalVariableName"/>
<module name="ClassTypeParameterName"/>
<module name="MethodTypeParameterName"/>
<module name="InterfaceTypeParameterName"/>
<module name="MethodName"/>
<module name="ConstantName"/>
<module name="StaticVariableName"/>

<!-- 使用 * 表示的 import 语句 -->
<module name="AvoidStarImport"/>
<!-- 没用的 import -->
<module name="UnusedImports"/>
<!-- 是否导入了多余的包 -->
<module name="RedundantImport"/>

<!-- 修饰符检查 -->
<!-- 检查修饰符的顺序是否遵照 java 语言规范,默认 public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
<module name="ModifierOrder"/>
<!-- 检查接口和 annotation 中是否有多余修饰符,如接口方法不必使用 public -->
<module name="RedundantModifier"/>

<!-- 是否有嵌套代码块 -->
<module name="AvoidNestedBlocks"/>
<!-- 是否有空代码块 -->
<module name="EmptyBlock"/>
<!-- 代码块是否缺失 {} -->
<module name="NeedBraces"/>
<!-- 左大括号位置 -->
<module name="LeftCurly"/>
<!-- 右大括号位置 -->
<module name="RightCurly"/>

<!-- 检查数组类型定义的样式 -->
<module name="ArrayTypeStyle" />
<!-- 检查 switch 语句是否具有“default”子句 -->
<module name="MissingSwitchDefault" />
<!-- 检查 switch 语句(跨越分支) -->
<module name="FallThrough" />
<!-- 检查 long 型定义是否有大写的“L” -->
<module name="UpperEll" />

<module name="EmptyForInitializerPad"/>
<module name="EmptyForIteratorPad"/>
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true" />
</module>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoLineWrap"/>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="SingleSpaceSeparator"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>

</module>
</module>

将配置文件保存到项目的某个路径下,比如:style/demoCheckstyle.xml

添加 maven 插件

configLocation:是 Checkstyle 配置文件的相对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<build>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<configLocation>style/demoCheckStyle.xml</configLocation>
<includeTestSourceDirectory>false</includeTestSourceDirectory>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
</configuration>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

这样执行 mvn clean package 命令,在编译打包之前就会执行 Checkstyle 检查,并有类似如下的提示。

1
2
[INFO] --- maven-checkstyle-plugin:3.1.1:check (validate) @ cdb ---
[INFO] You have 0 Checkstyle violations.

参考链接

  • https://checkstyle.org
  • https://maven.apache.org/plugins/maven-checkstyle-plugin/