idea配置checkstyle

准备工作

checkstyle.xml

  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
 95
 96
 97
 98
 99
100
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--Refer http://checkstyle.sourceforge.net/reports/google-java-style.html#s2.2-file-encoding -->
<module name="Checker">

    <property name="localeLanguage" value="en"/>

    <!--To configure the check to report on the first instance in each file-->
    <module name="FileTabCharacter"/>

    <module name="RegexpSingleline">
        <property name="format" value="^.*System\.(out|err).*$"/>
        <property name="message" value="Don't use System.out/err, use SLF4J instead."/>
    </module>

    <module name="FileLength">
        <property name="max" value="3000"/>
    </module>

    <module name="TreeWalker">
        <property name="tabWidth" value="4"/>
        <module name="CommentsIndentation"/>
        <module name="SuppressionCommentFilter">
            <property name="offCommentFormat" value="CS:OFF:BEGIN"/>
            <property name="onCommentFormat" value="CS:OFF:END"/>
            <property name="checkFormat" value=".*"/>
        </module>
        <module name="UnusedImports">
            <property name="processJavadoc" value="true"/>
        </module>

        <module name="RedundantImport"/>

        <!--Checks that classes that override equals() also override hashCode()-->
        <module name="EqualsHashCode"/>
        <!--Checks for over-complicated boolean expressions. Currently finds code like if (topic == true), topic || true, !false, etc.-->
        <module name="SimplifyBooleanExpression"/>
        <module name="OneStatementPerLine"/>
        <module name="UnnecessaryParentheses"/>
        <!--Checks for over-complicated boolean return statements. For example the following code-->
        <module name="SimplifyBooleanReturn"/>

        <!--Check that the default is after all the cases in producerGroup switch statement-->
        <module name="DefaultComesLast"/>
        <!--Detects empty statements (standalone ";" semicolon)-->
        <module name="EmptyStatement"/>
        <!--Checks that long constants are defined with an upper ell-->
        <module name="UpperEll"/>
        <module name="ConstantName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)|(^logger)"/>
        </module>
        <!--Checks that local, non-final variable names conform to producerGroup format specified by the format property-->
        <module name="LocalVariableName"/>
        <!--Validates identifiers for local, final variables, including catch parameters-->
        <module name="LocalFinalVariableName"/>
        <!--Validates identifiers for non-static fields-->
        <module name="MemberName"/>
        <!--Validates identifiers for class type parameters-->
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <!--Validates identifiers for method type parameters-->
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <module name="PackageName">
            <property name="format" value="^run\.halo(\.[a-zA-Z][a-zA-Z0-9]*)+$"/>
        </module>
        <module name="ParameterName"/>
        <module name="StaticVariableName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>
        <module name="TypeName">
            <property name="format" value="(^[A-Z][a-zA-Z0-9]*$)|(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)"/>
        </module>

        <!--whitespace-->
        <module name="GenericWhitespace"/>
        <module name="NoWhitespaceBefore"/>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
        </module>
        <!-- Indentation -->
        <module name="Indentation">
            <property name="forceStrictCondition" value="true"/>
            <property name="throwsIndent" value="8"/>
            <property name="lineWrappingIndentation" value="8"/>
        </module>
        <module name="MethodParamPad"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>

    </module>

</module>

开始工作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
安装 CheckStyle-IDEA
进入 IDEA 插件市场:File | Settings | Plugins;
搜索 CheckStyle-IDEA,点击安装即可。
配置 CheckStyle
 进入 CheckStyle 配置:File | Settings | Other Settings | Checkstyle;

 在配置文件中点击添加按钮,配置描述可随便填写,选择 已有的checkstyle.xml,点击下一步和完成;

 勾选刚刚创建的配置文件。

配置 Editor
 进入编辑器配置:File | Settings | Editor | Code Style;

 导入 checkstyle.xml 配置:

另外也可以选择 flink 的配置文件

中文版 checkstyle.xml

  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
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">
    <!--
        If you set the basedir property below, then all reported file
        names will be relative to the specified directory. See
        http://checkstyle.sourceforge.net/5.x/config.html#Checker
        <property name="basedir" value="${basedir}"/>
    -->
    <!-- 检查每个包中是否有java注释文件,默认有package-info.java -->
    <!-- <module name="JavadocPackage"/> -->
    <!-- 检查文件是否以一个空行结束 -->
    <module name="NewlineAtEndOfFile"/>

    <!-- 检查property文件中是否有相同的key -->
    <module name="Translation"/>
    <!-- 文件长度不超过1500 -->
    <module name="FileLength">
        <property name="max" value="1500"/>
    </module>

    <!-- 检查文件中是否含有'\t' -->
    <module name="FileTabCharacter"/>

    <!-- Miscellaneous other checks. -->
    <module name="RegexpSingleline">
        <property name="format" value="\s+$"/>
        <property name="minimum" value="0"/>
        <property name="maximum" value="0"/>
        <property name="message" value="Line has trailing spaces."/>
    </module>

    <!-- 每个java文件一个语法树 -->
    <module name="TreeWalker">
        <!-- 注释检查 -->
        <!-- 检查方法和构造函数的javadoc -->
        <module name="JavadocMethod">
            <property name="tokens" value="METHOD_DEF" />
        </module>
        <!-- 检查类和接口的javadoc。默认不检查authorversion tags -->
        <module name="JavadocType"/>
        <!-- 检查变量的javadoc -->
        <!-- <module name="JavadocVariable"/> -->
        <!-- 检查javadoc的格式 -->
        <module name="JavadocStyle">
            <property name="checkFirstSentence" value="false"/>
        </module>
        <!-- 检查TODO:注释 -->
        <module name="TodoComment"/>

        <!-- 命名检查 -->
        <!-- 局部的final变量,包括catch中的参数的检查 -->
        <module name="LocalFinalVariableName" />
        <!-- 局部的非final型的变量,包括catch中的参数的检查 -->
        <module name="LocalVariableName" />
        <!-- 包名的检查(只允许小写字母),默认^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$" />
            <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
        </module>
        <!-- 仅仅是static型的变量(不包括static final型)的检查 -->
        <module name="StaticVariableName" />
        <!-- ClassInterface名检查,默认^[A-Z][a-zA-Z0-9]*$-->
        <module name="TypeName">
            <property name="severity" value="warning"/>
            <message key="name.invalidPattern" value="名称 ''{0}'' 要符合 ''{1}''格式."/>
        </module>
        <!-- static型变量的检查 -->
        <module name="MemberName" />
        <!-- 方法名的检查 -->
        <module name="MethodName" />
        <!-- 方法的参数名 -->
        <!-- <module name="ParameterName " /> -->
        <!-- 常量名的检查(只允许大写),默认^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
        <module name="ConstantName" />

        <!-- 定义检查 -->
        <!-- 检查数组类型定义的样式 -->
        <module name="ArrayTypeStyle"/>
        <!-- 检查方法名、构造函数、catch块的参数是否是final -->
        <!-- <module name="FinalParameters"/> -->
        <!-- 检查long型定义是否有大写的“L -->
        <module name="UpperEll"/>


        <!-- Checks for Headers                                -->
        <!-- See http://checkstyle.sf.net/config_header.html   -->
        <!-- <module name="Header">                            -->
        <!-- The follow property value demonstrates the ability     -->
        <!-- to have access to ANT properties. In this case it uses -->
        <!-- the ${basedir} property to allow Checkstyle to be run  -->
        <!-- from any directory within a project. See property      -->
        <!-- expansion,                                             -->
        <!-- http://checkstyle.sf.net/config.html#properties        -->
        <!-- <property                                              -->
        <!--     name="headerFile"                                  -->
        <!--     value="${basedir}/java.header"/>                   -->
        <!-- </module> -->

        <!-- Following interprets the header file as regular expressions. -->
        <!-- <module name="RegexpHeader"/>                                -->


        <!-- import检查-->
        <!-- 避免使用* -->
        <module name="AvoidStarImport"/>
        <!-- 检查是否从非法的包中导入了类 -->
        <module name="IllegalImport"/>
        <!-- 检查是否导入了多余的包 -->
        <module name="RedundantImport"/>
        <!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang4.import 与该类在同一个package -->
        <module name="UnusedImports" />

        <!-- 长度检查 -->
        <!-- 每行不超过150个字符 -->
        <module name="LineLength">
            <property name="max" value="150" />
        </module>
        <!-- 方法不超过150 -->
        <module name="MethodLength">
            <property name="tokens" value="METHOD_DEF" />
            <property name="max" value="30" />
        </module>
        <!-- 方法的参数个数不超过10个。 并且不对构造方法进行检查-->
        <module name="ParameterNumber">
            <property name="max" value="10" />
            <property name="ignoreOverriddenMethods" value="true"/>
            <property name="tokens" value="METHOD_DEF" />
        </module>

        <!-- 空格检查-->
        <!-- 方法名后跟左圆括号"(" -->
        <module name="MethodParamPad" />
        <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
        <module name="TypecastParenPad" />
        <!-- Iterator -->
        <!-- <module name="EmptyForIteratorPad"/> -->
        <!-- 检查尖括号 -->
        <!-- <module name="GenericWhitespace"/> -->
        <!-- 检查在某个特定关键字之后应保留空格 -->
        <module name="NoWhitespaceAfter"/>
        <!-- 检查在某个特定关键字之前应保留空格 -->
        <module name="NoWhitespaceBefore"/>
        <!-- 操作符换行策略检查 -->
        <module name="OperatorWrap"/>
        <!-- 圆括号空白 -->
        <module name="ParenPad"/>
        <!-- 检查分隔符是否在空白之后 -->
        <module name="WhitespaceAfter"/>
        <!-- 检查分隔符周围是否有空白 -->
        <module name="WhitespaceAround"/>


        <!-- 修饰符检查 -->
        <!-- 检查修饰符的顺序是否遵照java语言规范,默认publicprotectedprivateabstractstaticfinaltransientvolatilesynchronizednativestrictfp -->
        <module name="ModifierOrder"/>
        <!-- 检查接口和annotation中是否有多余修饰符,如接口方法不必使用public -->
        <module name="RedundantModifier"/>


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


        <!-- 代码检查 -->
        <!-- 检查是否在同一行初始化 -->
        <!-- <module name="AvoidInlineConditionals"/> -->
        <!-- 检查空的代码段 -->
        <module name="EmptyStatement"/>
        <!-- 检查在重写了equals方法后是否重写了hashCode方法 -->
        <module name="EqualsHashCode"/>
        <!-- 检查局部变量或参数是否隐藏了类中的变量 -->
        <module name="HiddenField">
            <property name="tokens" value="VARIABLE_DEF"/>
        </module>
        <!-- 检查是否使用工厂方法实例化 -->
        <module name="IllegalInstantiation"/>
        <!-- 检查子表达式中是否有赋值操作 -->
        <module name="InnerAssignment"/>
        <!-- 检查是否有"魔术"数字 -->
        <module name="MagicNumber">
            <property name="ignoreNumbers" value="0, 1"/>
            <property name="ignoreAnnotation" value="true"/>
        </module>
        <!-- 检查switch语句是否有default -->
        <module name="MissingSwitchDefault"/>
        <!-- 检查是否有过度复杂的布尔表达式 -->
        <module name="SimplifyBooleanExpression"/>
        <!-- 检查是否有过于复杂的布尔返回代码段 -->
        <module name="SimplifyBooleanReturn"/>

        <!-- 类设计检查 -->
        <!-- 检查类是否为扩展设计l -->
        <!-- <module name="DesignForExtension"/> -->
        <!-- 检查只有private构造函数的类是否声明为final -->
        <module name="FinalClass"/>
        <!-- 检查工具类是否有putblic的构造器 -->
        <module name="HideUtilityClassConstructor"/>
        <!-- 检查接口是否仅定义类型 -->
        <module name="InterfaceIsType"/>
        <!-- 检查类成员的可见度 -->
        <module name="VisibilityModifier"/>


        <!-- 其他检查 -->
        <!-- 不许出现空语句 -->
        <module name="EmptyStatement"/>
        <!-- 不许使用未被简化的条件表达式 -->
        <module name="SimplifyBooleanExpression"/>
        <!-- 不许使用未被简化的布尔返回值 -->
        <module name="SimplifyBooleanReturn"/>
        <!-- String的比较不能用!=  == -->
        <module name="StringLiteralEquality"/>
        <!-- if最多嵌套3 -->
        <module name="NestedIfDepth">
            <property name="max" value="3"/>
        </module>
        <!-- try最多被嵌套1 -->
        <module name="NestedTryDepth"/>
        <!-- 一个方法中最多有3return -->
        <module name="ReturnCount">
        <property name="max" value="3"/>
        </module>
        <!-- 不许对方法的参数赋值 -->
        <module name="ParameterAssignment"/>
        <!-- 不许有同样内容的String -->
        <module name="MultipleStringLiterals"/>
        <!-- 同一行不能有多个声明 -->
        <module name="MultipleVariableDeclarations"/>


        <!-- 各种量度 -->
        <!-- 布尔表达式的复杂度,不超过3 -->
        <module name="BooleanExpressionComplexity"/>
        <!-- 类数据的抽象耦合,不超过7 -->
        <module name="ClassDataAbstractionCoupling"/>
        <!-- 类的分散复杂度,不超过20 -->
        <module name="ClassFanOutComplexity"/>
        <!-- 函数的分支复杂度,不超过10 -->
        <module name="CyclomaticComplexity"/>
        <!-- NPath复杂度,不超过200 -->
        <module name="NPathComplexity"/>
    </module>
</module>

参考文档:

https://cloud.tencent.com/developer/article/2101915

https://cloud.tencent.com/developer/article/1697937

maven 指定 settings.xml

1
mvn install --settings c:\user\settings.xml

maven 中添加项目,参照 github

1
 git@github.com:huangxiaofeng10047/spring-boot-best-practice.git (

再其中 pom 可以查看到如何设置 pom 文件进行项目检测。

另外 git-hooks 的 pre-commit 会进行代码提交检测。

参考文档:

https://blog.csdn.net/aouoy/article/details/106916263

https://maven.apache.org/plugins/maven-checkstyle-plugin/examples/multi-module-config.html (官方)

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up