Java后端项目IDEA配置代码规范检查,使用checkStyle实现

2023-11-09 07:20

本文主要是介绍Java后端项目IDEA配置代码规范检查,使用checkStyle实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近的Java后端项目想实现代码的规范检查,调研了一圈,终于找到了简单的方式实现:以下是常见的几种方案:

1、在客户端做 git hook,主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很明显,就是在本地把这个钩子删了、或者 git commit --no-verify 就绕开了。不过小团队、大家约定好的话这种方案是最方便的。

2、在服务端做 git hook,主要是用 pre-receive 这个钩子。

3、不限制 push、但通过其他方式限制。比如可以通过 CI 限制,例如在 forking-workflow 模式中设置在 Merge 时自动执行一个 Actions 来执行 Lint,对于不合格的 Merge Request 直接关闭掉不允许合并,以变相到达不合格代码进入主干的目的。

其中 1、2 两点跟 GitLab 无关,需要的都是写 Shell 脚本而已。第 3 种可以在 GitLab 用图形化方式设置。

小团队的第一种用的比较多;大团队这一步骤大多是跟 CI/CD 工作流紧密结合的。

我们用的方式是第一种在客户端校验,加上checkStyle 工具包,checkStyle可以直接在IDEA插件中搜索。

下载Checkstyle jar包 官网地址,GitHulb,目前最近版本为checkstyle-8.12-all.jar

下载对应的规范约束xml文件,目前主要是有三种Alibaba_check.xml、sun_checks.xml 和google_checks.xml

我们用的完整的规范如下:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC"-//Puppy Crawl//DTD Check Configuration 1.3//EN""http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<!--文件描述:阿里巴巴代码规范完整版-->
<!--创建日期:20230203-->
<!--创建人:QC班长-->
<module name="Checker"><!-- 检查文件是否以一个空行结束 --><module name="NewlineAtEndOfFile"/><!-- 长度检查 --><!-- 每行不超过120个字符 --><module name="LineLength"><property name="max" value="120" /></module><!-- 文件长度不超过1500行 --><module name="FileLength"><property name="max" value="1500"/></module><!-- 每个java文件一个语法树 --><module name="TreeWalker"><!-- import检查--><!-- 避免使用* -->
<!--        <module name="AvoidStarImport">-->
<!--            <property name="excludes" value="java.io,java.net,java.lang.Math"/>-->
<!--            &lt;!&ndash; 实例;import java.util.*;.&ndash;&gt;-->
<!--            <property name="allowClassImports" value="false"/>-->
<!--            &lt;!&ndash; 实例 ;import static org.junit.Assert.*;&ndash;&gt;-->
<!--            <property name="allowStaticMemberImports" value="true"/>-->
<!--        </module>--><!-- 检查是否从非法的包中导入了类 --><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><!-- 命名检查 --><!-- 局部的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" /><!-- Class或Interface名检查,默认^[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"/><!-- 检查long型定义是否有大写的“L” --><module name="UpperEll"/><!-- 方法不超过50行 --><module name="MethodLength"><property name="tokens" value="METHOD_DEF" /><property name="max" value="50" /></module><!-- 方法的参数个数不超过5个。 并且不对构造方法进行检查--><module name="ParameterNumber"><property name="max" value="5" /><property name="ignoreOverriddenMethods" value="true"/><property name="tokens" value="METHOD_DEF" /></module><!-- 空格检查--><!-- 方法名后跟左圆括号"(" --><module name="MethodParamPad" /><!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 --><module name="TypecastParenPad" /><!-- 检查在某个特定关键字之后应保留空格 --><module name="NoWhitespaceAfter"/><!-- 检查在某个特定关键字之前应保留空格 --><module name="NoWhitespaceBefore"/><!-- 操作符换行策略检查 --><module name="OperatorWrap"/><!-- 圆括号空白 --><module name="ParenPad"/><!-- 检查分隔符是否在空白之后 --><module name="WhitespaceAfter"/><!-- 检查分隔符周围是否有空白 --><module name="WhitespaceAround"/><!-- 修饰符检查 --><!-- 检查修饰符的顺序是否遵照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="LeftCurly"/><!-- 检查代码块是否缺失{} --><module name="NeedBraces"/><!-- 检查右大括号位置 --><module name="RightCurly"/><!-- 代码检查 --><!-- 检查空的代码段 --><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 --><!-- 检查只有private构造函数的类是否声明为final --><module name="FinalClass"/><!-- 检查工具类是否有putblic的构造器 --><module name="HideUtilityClassConstructor"/><!-- 检查接口是否仅定义类型 --><module name="InterfaceIsType"/><!-- 检查类成员的可见度 检查类成员的可见性。只有static final 成员是public的除非在本检查的protectedAllowed和packagedAllowed属性中进行了设置--><module name="VisibilityModifier"><property name="packageAllowed" value="true"/><property name="protectedAllowed" value="true"/></module><!-- 语法 --><!-- String的比较不能用!= 和 == --><module name="StringLiteralEquality"/><!-- 限制for循环最多嵌套2层 --><module name="NestedForDepth"><property name="max" value="2"/></module><!-- if最多嵌套3层 --><module name="NestedIfDepth"><property name="max" value="3"/></module><!-- 检查未被注释的main方法,排除以Appllication结尾命名的类 --><module name="UncommentedMain"><property name="excludedClasses" value=".*Application$"/></module><!-- 禁止使用System.out.println --><module name="Regexp"><property name="format" value="System\.out\.println"/><property name="illegalPattern" value="true"/></module><!-- return个数 3个--><module name="ReturnCount"><property name="max" value="3"/></module><!--try catch 异常处理数量 3--><module name="NestedTryDepth "><property name="max" value="3"/></module><!-- clone方法必须调用了super.clone() --><module name="SuperClone" /><!-- finalize 必须调用了super.finalize() --><module name="SuperFinalize" /></module>
</module>

IDEA中的配置


代码规范检测工具配置


打开file --> settings,找到Plugins ,输入 checkStyle-IDEA,点击install 安装

考虑到CheckStyle提供的校验规则很严格,这里我们用自定义的校验规则[alibaba-checks.xml]


打开file --> settings,找到Tools ,可以看到安装好的 checkstyle,Configuration File-->点击➕添加项目中的配置文件,选择checks/alibaba-checks.xml文件,输入名称,点击下一步,完成。

 这样子就好了,不符合规范的代码会直接标红显示

 参考文献:


1、java代码提交到git服务器如何能自动检查代码规范? - SegmentFault 思否

2、git下使用checkstyle构建代码风格检查_唯一昵称真难的博客-CSDN博客_checkstyle+git 

3、符合阿里巴巴代码规范的checkstyle检测文件_KimZing的博客-CSDN博客 

4、pre-commit 

5、使用 pre-commit 实现代码检查_清欢守护者的博客-CSDN博客 

这篇关于Java后端项目IDEA配置代码规范检查,使用checkStyle实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374699

相关文章

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F