一、CheckStyle简介
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要但是枯燥的任务中解脱出来。
CheckStyle检验的主要内容为:
-
Javadoc注释
-
命名约定
-
标题
-
Import语句
-
体积大小
-
空白
-
修饰符
-
块
-
代码问题
-
类设计
-
混合检查(包括一些有用的比如非必须的System.out和printstackTrace)
二、CheckStyle配置教程
checkstyle配置有两种方式,第一种为安装插件,第二种为添加依赖,推荐使用第二种。
(一)安装插件方式
安装CheckStyle-IDEA插件,安装好后重启idea;
给CheckStyle插件配置checkstyle.xml文件;
checkstyle.xml代码:
<?xml version="1.0"?><!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd"><module name="Checker"> <property name="charset" value="UTF-8"/> <property name="fileExtensions" value="java"/> <!-- 文件长度不超过1500行 --> <module name="FileLength"> <property name="max" value="1500"/> </module> <!-- TreeWalker Checks --> <module name="TreeWalker"> <module name="SuppressWarningsHolder"/> <!--避免转义unicode字符--> <module name="AvoidEscapedUnicodeCharacters"> <property name="allowEscapesForControlCharacters" value="true"/> <property name="allowByTailComment" value="true"/> <property name="allowNonPrintableEscapes" value="true"/> </module> <module name="NoLineWrap"/> <module name="OuterTypeFilename"/> <!-- import检查--> <!-- 检查是否从非法的包中导入了类 --> <module name="IllegalImport"/> <!-- 检查是否导入了多余的包 --> <module name="RedundantImport"/> <!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import 与该类在同一个package的 --> <module name="UnusedImports"/> <!-- 注释检查 --> <!-- 检查方法和构造函数的javadoc --> <module name="JavadocType"> <property name="allowUnknownTags" value="true"/> <message key="javadoc.missing" value="类注释:缺少Javadoc注释。"/> </module> <!-- 检查方法的javadoc --> <module name="JavadocMethod"> <property name="allowedAnnotations" value="Override, Test"/> <property name="tokens" value="METHOD_DEF, ANNOTATION_FIELD_DEF "/> <message key="javadoc.missing" value="方法注释:缺少Javadoc注释。"/> </module> <!-- 检查方法的javadoc是否缺失--> <module name="MissingJavadocMethod"> <property name="tokens" value="METHOD_DEF, ANNOTATION_FIELD_DEF "/> </module> <!-- 检查类型的javadoc是否缺失--> <module name="MissingJavadocType"/> <module name="RequireEmptyLineBeforeBlockTagGroup"/> <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="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="ParameterName"/> <!-- 常量名的检查(只允许大写),默认^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ --> <module name="ConstantName"/> <!-- 检查long型定义是否有大写的“L” --> <module name="UpperEll"/> <!-- 检查switch语句是否有default --> <module name="MissingSwitchDefault"/> <!-- 语法 --> <!-- String的比较不能用!= 和 == --> <module name="StringLiteralEquality"/> <!-- 禁止使用System.out.println --> <module name="Regexp"> <property name="format" value="System\.out\.println"/> <property name="illegalPattern" value="true"/> </module> <!--重载方法申明顺序--> <module name="OverloadMethodsDeclarationOrder"/> <!--变量声明和第一次使用之间的距离--> <module name="VariableDeclarationUsageDistance"/> <!--方法参数之间的空格--> <module name="MethodParamPad"> <property name="tokens" value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF, SUPER_CTOR_CALL, ENUM_CONSTANT_DEF, RECORD_DEF"/> </module> <!--符号面前不允许空格--> <module name="NoWhitespaceBefore"> <property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, LABELED_STAT, METHOD_REF"/> <property name="allowLineBreaks" value="true"/> </module> <!--括号填充的空格--> <module name="ParenPad"> <property name="tokens" value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF, EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW, LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL, METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA, RECORD_DEF"/> </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, QUESTION, SL, SR, STAR, METHOD_REF, TYPE_EXTENSION_AND "/> </module> <!--注解位置--> <module name="AnnotationLocation"> <property name="id" value="AnnotationLocationMostCases"/> <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, RECORD_DEF, COMPACT_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="NonEmptyAtclauseDescription"/> <module name="InvalidJavadocPosition"/> <module name="JavadocTagContinuationIndentation"/> <!--命名校验--> <module name="AbbreviationAsWordInName"> <property name="ignoreStatic" value="false"/> <property name="allowedAbbreviationLength" value="1"/> <property name="allowedAbbreviations" value="XML,URL,TRS,VO,DTO,PKI,MAC,IMEI,IMSI"/> </module> <module name="LocalVariableName"> <property name="format" value="^[a-z][a-z0-9]*([A-Z][a-z0-9]+)*(DO|DTO|VO|DAO|BO|DOList|DTOList|VOList|DAOList|BOList|X|Y|Z|UDF|UDAF|[A-Z])?$"/> <property name="allowOneCharVarInForLoop" value="true"/> <message key="name.invalidPattern" value="局部变量命名 ''{0}'' 不满足lowerCaseCamel命名规范"/> </module> <module name="MemberName"> <property name="format" value="^[a-z][a-z0-9]*([A-Z][a-z0-9]+)*(DO|DTO|VO|DAO|BO|DOList|DTOList|VOList|DAOList|BOList|X|Y|Z|UDF|UDAF|[A-Z])?$"/> <message key="name.invalidPattern" value="成员变量命名 ''{0}'' 不满足lowerCaseCamel命名规范"/> </module> <module name="MethodName"> <message key="name.invalidPattern" value="方法命名 ''{0}'' 不满足lowerCaseCamel命名规范"/> </module> <module name="PackageName"> <message key="name.invalidPattern" value="包命名 ''{0}'' 不满足命名规范"/> </module> <module name="ParameterName"> <message key="name.invalidPattern" value="方法传参命名 ''{0}'' 不满足lowerCaseCamel命名规范"/> </module> </module></module>
点击加号,导入checkstyle.xml;
点击apply,点击ok;
点击选择刚才导入的checkstyle;
分别对类、包、项目进行检查可以发现代码中不规范的地方;
若无问题则显示Checkstyle found no promblems in the file(s);
此插件配置可以在自己练习时使用,不过与插件检测与maven检测有差异,推荐使用maven编译检测。
(二)添加依赖方式
将checkstyle.xml文件放在项目根目录下(或新建codestyle文件夹放里面);
在pom.xml中添加checkstyle依赖;
<plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-checkstyle-pluginartifactId> <version>3.1.2version> <dependencies> <dependency> <groupId>com.puppycrawl.toolsgroupId> <artifactId>checkstyleartifactId> <version>8.36.2version> dependency> dependencies> <executions> <execution> <id>checkstyle-validationid> <phase>compilephase> <configuration> <configLocation>checkstyle.xmlconfigLocation> <encoding>UTF-8encoding> <consoleOutput>trueconsoleOutput> <failOnViolation>truefailOnViolation> configuration> <goals> <goal>checkgoal> goals> execution> executions>plugin>
项目写完后点击maven,点击compile编译项目;
查看编译信息,可以看到检查出来的问题;
根据提示对代码进行修改,直到检测出来所有代码没有问题。
来源地址:https://blog.csdn.net/m0_58969296/article/details/128054864