前言
本文介绍使用checkstyle 对java 代码进行规范限制。
一、checkstyle是什么?
checkstyle 是一款开源的代码静态检查工具,主要用于 强制遵循代码规范(如命名规则、代码格式、注释要求等),支持 java 等语言。它通过预定义或自定义的规则集,自动检测代码中不符合规范的问题(如类名未用 pascalcase、方法缺少 javadoc 注释、多余的空行等),帮助团队统一编码风格、提升代码可读性和可维护性
官网介绍:https://checkstyle.sourceforge.io/
二、checkstyle 在idea 中如何配置:
2.1.idea checkstyle 插件安装
idea,进入 file -> settings -> plugins,在搜索框输入 checkstyle,找到官方插件(通常名为 checkstyle-idea),点击 install 安装,重启 idea 生效

2.2 配置 checkstyle 规则集:
intellij idea -> settings -> tools -> checkstyle 在 configuration file 区域配置检查规则
在项目根目录新增checkstyle.xml 的配置规则:

checkstyle.xml校验的内容为:
<?xml version="1.0"?>
<!doctype module public
"-//checkstyle//dtd checkstyle configuration 1.3//en"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!-- copyright (c) 2019 check holding ltd. all rights reserved. -->
<module name="checker">
<property name="charset" value="utf-8"/>
<property name="severity" value="error"/>
<property name="fileextensions" value="java, properties, xml"/>
<!-- headers begin -->
<!-- see https://checkstyle.sourceforge.io/config_header.html -->
<!-- <module name="regexpheader">-->
<!-- <property name="header" value="copyright \(c\) \d{4} check holding ltd. all rights reserved.$"/>-->
<!-- </module>-->
<!-- headers end -->
<!-- miscellaneous begin -->
<!-- see https://checkstyle.sourceforge.io/config_misc.html -->
<module name="uniqueproperties"/>
<!-- miscellaneous end -->
<!-- size violations begin -->
<!-- see https://checkstyle.sourceforge.io/config_sizes.html -->
<module name="filelength"/>
<module name="linelength">
<property name="max" value="120"/>
<!-- ignore all imports -->
<property name="ignorepattern" value="^import "/>
</module>
<!-- size violations end -->
<!-- whitespace begin -->
<!-- see https://checkstyle.sourceforge.io/config_whitespace.html -->
<module name="filetabcharacter">
<property name="eachline" value="true"/>
</module>
<!-- whitespace end -->
<module name="treewalker">
<!-- annotations begin -->
<!-- see https://checkstyle.sourceforge.io/config_annotation.html -->
<module name="annotationlocation">
<property name="id" value="annotationlocationmostcases"/>
<property name="tokens"
value="class_def, interface_def, enum_def, method_def, ctor_def"/>
</module>
<module name="annotationlocation">
<property name="id" value="annotationlocationvariables"/>
<property name="tokens" value="variable_def"/>
<property name="allowsamelinemultipleannotations" value="true"/>
</module>
<module name="annotationlocation"/>
<module name="missingoverride"/>
<!-- make the @suppresswarnings annotations available to checkstyle -->
<module name="suppresswarningsholder"/>
<!-- annotations end -->
<!-- block checks begin -->
<!-- see https://checkstyle.sourceforge.io/config_blocks.html -->
<module name="avoidnestedblocks"/>
<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="emptycatchblock">
<property name="exceptionvariablename" value="expected"/>
</module>
<module name="leftcurly"/>
<module name="rightcurly">
<property name="id" value="rightcurlysame"/>
<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"/>
</module>
<module name="needbraces"/>
<!-- block checks end -->
<!-- class design begin -->
<!-- see https://checkstyle.sourceforge.io/config_design.html -->
<module name="interfaceistype"/>
<!-- <module name="mutableexception"/>-->
<module name="onetoplevelclass"/>
<module name="throwscount"/>
<!-- class design end -->
<!-- coding begin -->
<!-- see https://checkstyle.sourceforge.io/config_coding.html -->
<!-- <module name="avoiddoublebraceinitialization"/>-->
<module name="avoidnoargumentsuperconstructorcall"/>
<module name="covariantequals"/>
<module name="defaultcomeslast"/>
<module name="emptystatement"/>
<module name="equalshashcode"/>
<module name="fallthrough"/>
<module name="illegaltokentext">
<property name="tokens" value="string_literal, char_literal"/>
<property name="format"
value="\\u00(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="consider using special escape sequence instead of octal value or unicode escaped value."/>
</module>
<module name="innerassignment"/>
<module name="missingswitchdefault"/>
<module name="multiplevariabledeclarations"/>
<module name="nestedfordepth">
<property name="max" value="3"/>
</module>
<module name="nestedifdepth">
<property name="max" value="3"/>
</module>
<module name="nestedtrydepth">
<property name="max" value="2"/>
</module>
<module name="noclone"/>
<module name="nofinalizer"/>
<module name="onestatementperline"/>
<module name="overloadmethodsdeclarationorder"/>
<module name="packagedeclaration"/>
<!-- <module name="parameterassignment"/>-->
<module name="simplifybooleanexpression"/>
<module name="simplifybooleanreturn"/>
<module name="stringliteralequality"/>
<!-- <module name="unnecessaryparentheses"/>-->
<module name="unnecessarysemicolonaftertypememberdeclaration"/>
<module name="unnecessarysemicolonintrywithresources"/>
<module name="variabledeclarationusagedistance"/>
<!-- coding end -->
<!-- imports begin -->
<!-- see https://checkstyle.sourceforge.io/config_imports.html -->
<module name="avoidstarimport"/>
<module name="illegalimport"/> <!-- defaults to sun.* packages -->
<module name="importorder">
<property name="groups" value="java,javax,org,com"/>
<property name="ordered" value="true"/>
<property name="separated" value="true"/>
<property name="option" value="top"/>
</module>
<module name="redundantimport"/>
<module name="unusedimports"/>
<!-- imports end -->
<!-- javadoc comments begin -->
<!-- see https://checkstyle.sourceforge.io/config_javadoc.html -->
<module name="javadocparagraph">
<property name="allownewlineparagraph" value="false"/>
</module>
<module name="javadocstyle">
<property name="checkfirstsentence" value="false"/>
</module>
<module name="javadoctagcontinuationindentation"/>
<module name="javadoctype">
<property name="scope" value="public"/>
</module>
<module name="missingjavadoctype"/>
<module name="nonemptyatclausedescription"/>
<module name="singlelinejavadoc">
<property name="ignoreinlinetags" value="false"/>
</module>
<module name="summaryjavadoc">
<property name="period" value=""/>
</module>
<!-- javadoc comments end -->
<!-- metrics begin -->
<!-- see https://checkstyle.sourceforge.io/config_metrics.html -->
<module name="booleanexpressioncomplexity">
<property name="max" value="7"/>
</module>
<!-- <module name="classdataabstractioncoupling">-->
<!-- <property name="excludeclassesregexps" value=".*response$,.*request$"/>-->
<!-- </module>-->
<!-- <module name="classfanoutcomplexity">-->
<!-- <property name="excludeclassesregexps" value=".*response$,.*request$"/>-->
<!-- </module>-->
<module name="cyclomaticcomplexity"/>
<!-- <module name="javancss"/>-->
<!-- metrics end -->
<!-- miscellaneous begin -->
<!-- see https://checkstyle.sourceforge.io/config_misc.html -->
<module name="arraytypestyle"/>
<module name="avoidescapedunicodecharacters">
<property name="allowescapesforcontrolcharacters" value="true"/>
<property name="allowbytailcomment" value="true"/>
<property name="allownonprintableescapes" value="true"/>
</module>
<module name="commentsindentation"/>
<module name="indentation">
<property name="basicoffset" value="4"/>
<property name="braceadjustment" value="0"/>
<property name="caseindent" value="4"/>
<property name="throwsindent" value="8"/>
<property name="linewrappingindentation" value="8"/>
<property name="arrayinitindent" value="4"/>
</module>
<module name="outertypefilename"/>
<module name="upperell"/>
<!-- miscellaneous end -->
<!-- modifiers begin -->
<!-- see https://checkstyle.sourceforge.io/config_modifier.html -->
<module name="modifierorder"/>
<!-- modifiers end -->
<!-- naming conventions begin -->
<!-- see https://checkstyle.sourceforge.io/config_naming.html -->
<!-- <module name="abbreviationaswordinname">-->
<!-- <property name="ignorefinal" value="false"/>-->
<!-- <property name="allowedabbreviationlength" value="1"/>-->
<!-- </module>-->
<module name="catchparametername">
<property name="format" value="^[a-z]([a-z0-9][a-za-z0-9]*)?$"/>
<message key="name.invalidpattern"
value="catch parameter 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="constantname"/>
<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="lambdaparametername">
<property name="format" value="^[a-z]([a-z0-9][a-za-z0-9]*)?$"/>
<message key="name.invalidpattern"
value="lambda parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="localvariablename">
<property name="tokens" value="variable_def"/>
<property name="format" value="^[a-z]([a-z0-9][a-za-z0-9]*)?$"/>
<message key="name.invalidpattern"
value="local variable name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="membername">
<property name="format" value="^[a-z][a-za-z0-9]*$"/>
<message key="name.invalidpattern"
value="member name ''{0}'' must match pattern ''{1}''."/>
</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="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="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="parametername">
<property name="format" value="^[a-z]([a-z0-9][a-za-z0-9]*)?$"/>
<message key="name.invalidpattern"
value="parameter name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="typename">
<message key="name.invalidpattern"
value="type name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- naming conventions end -->
<!-- size violations begin -->
<!-- see https://checkstyle.sourceforge.io/config_sizes.html -->
<module name="anoninnerlength"/>
<!-- <module name="executablestatementcount"/>-->
<module name="methodcount"/>
<module name="methodlength">
<property name="max" value="200"/>
</module>
<module name="outertypenumber"/>
<module name="parameternumber">
<property name="max" value="9"/>
</module>
<!-- size violations end -->
<!-- whitespace begin -->
<!-- see https://checkstyle.sourceforge.io/config_whitespace.html -->
<module name="emptylineseparator">
<property name="allownoemptylinebetweenfields" value="true"/>
</module>
<module name="genericwhitespace"/>
<module name="methodparampad"/>
<module name="nolinewrap"/>
<module name="nowhitespaceafter"/>
<module name="nowhitespacebefore">
<property name="tokens" value="comma, semi, post_inc, post_dec, dot, ellipsis, method_ref"/>
<property name="allowlinebreaks" value="true"/>
</module>
<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, method_ref "/>
</module>
<module name="parenpad"/>
<module name="separatorwrap">
<property name="id" value="separatorwrapdot"/>
<property name="tokens" value="dot"/>
<property name="option" value="nl"/>
</module>
<module name="separatorwrap">
<property name="id" value="separatorwrapcomma"/>
<property name="tokens" value="comma"/>
<property name="option" value="eol"/>
</module>
<module name="separatorwrap">
<!-- ellipsis is eol until https://github.com/google/styleguide/issues/258 -->
<property name="id" value="separatorwrapellipsis"/>
<property name="tokens" value="ellipsis"/>
<property name="option" value="eol"/>
</module>
<module name="separatorwrap">
<!-- array_declarator is eol until https://github.com/google/styleguide/issues/259 -->
<property name="id" value="separatorwraparraydeclarator"/>
<property name="tokens" value="array_declarator"/>
<property name="option" value="eol"/>
</module>
<module name="separatorwrap">
<property name="id" value="separatorwrapmethodref"/>
<property name="tokens" value="method_ref"/>
<property name="option" value="nl"/>
</module>
<module name="singlespaceseparator"/>
<module name="typecastparenpad"/>
<module name="whitespaceafter"/>
<module name="whitespacearound">
<property name="allowemptyconstructors" value="true"/>
<property name="allowemptymethods" value="true"/>
<property name="allowemptytypes" value="true"/>
<property name="allowemptyloops" value="true"/>
<property name="ignoreenhancedforcolon" value="false"/>
<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>
<!-- whitespace end -->
<module name="suppressioncommentfilter"/>
</module>
<module name="suppresswarningsfilter"/>
</module>
添加本地的checkstyle 文件

最后勾选 要使用的校验文件,进行apply:

2.3 idea 中配置java 的import 顺序:
editor->code style->java->imports 配置 导 包顺序
(1)配置imports 都以单个文件进行导入

(2)配置导包的属性:

2.4 去除idea 本身保存时的格式化

三、checkstyle 在idea 中如何使用:
配置完成后,在编写代码时,会进行实时校验,鼠标悬停可以查看提示

也可以在某个文件中,右键check 文件

回对该文件进行检查并输出:

可以使用 代码格式化的快捷键: ctrl+alt+l 进行代码格式化
如果导包出现顺序问题可以使用快捷键:ctrl+alt+o 优化导入的顺序
总结
本文记录在intellij idea 中如何使用 checkstyle对java代码规范检查。
到此这篇关于intellij idea中如何使用checkstyle对java代码规范检查的文章就介绍到这了,更多相关checkstyle对java代码规范检查内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论