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"/>-->
<!-- <!– 实例;import java.util.*;.–>-->
<!-- <property name="allowClassImports" value="false"/>-->
<!-- <!– 实例 ;import static org.junit.Assert.*;–>-->
<!-- <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实现
最近的Java后端项目想实现代码的规范检查,调研了一圈,终于找到了简单的方式实现:以下是常见的几种方案: 1、在客户端做 git hook,主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很…...

Nginx_4
Nginx负载均衡 负载均衡概述 早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,…...

linux Ubuntu KUbuntu 系统安装相关
系统安装 本来想快到中午的时候调试一下服务器上的http请求接收代码。我的电脑上装的是kali的U盘系统,然后我的U盘居然找不到了(然后之前安装的系统不知道是否是写入软件的原因,没办法解析DNS,我都用的转发的,这让我体验非常差。kali的系统工具很多&…...

个人信息保护认证
个人信息保护认证是证明个人信息处理者在认证范围内开展的个人信息收集、存储、使用、加工、传输、提供、公开、删除以及跨境等处理活动符合认证依据标准要求。适用范围 本规则依据《中华人民共和国认证认可条例》制定,规定了对个人信息处理者开展个人信息收集、存储…...
Negative Prompt in Stable Diffusion
必读链接:https://www.reddit.com/r/StableDiffusion/comments/z7salo/with_the_right_prompt_stable_diffusion_20_can_do/ A lot of people have noticed that Negative Prompt works wonders in 2.0, and works even better in 2.1. Negative hints are the op…...

MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量
介绍MLX90316是Tria⊗is旋转位置传感器,提供在设备表面旋转的小偶极磁铁(轴端磁铁)的绝对角位置。得益于其表面的集成磁集中器(IMC),单片设备以非接触式方式感知应用磁通量密度的水平分量。这种独特的传感原理应用于旋转位置传感器,可在机械(…...

Reflections反射包在springboot jar环境下扫描不到class排查过程
需求: 要实现指定pkg(如com.qiqitrue.test.pojo)扫描包下所有class类信息:使用代码如下 使用的版本:0.10.2(截至目前是最新版)发现只能在idea编译期间可以获取得到(也就是在开发阶段…...

黑马】后台项目171集
将近一个月没有练习了,找到之后果然打不开出了问题【问题】运行代码打开网页后,发现不能正常登录,一开始还以为是密码记错了,后来发现是数据库没有正常启动,phpstudy中的数据库一直是启动状态,关闭不了。【…...

Qt 5 架构和特点
Qt 5 模块构架: 模块:功能:Qt CoreQt 5 的核心类库,每个模块都建立在Core上Qt GUI图形用户界面开发的最基础的类库Qt Widgets提供c用户界面部件(是对Qt GUI的拓展)Qt SQL对数据库进行操作Qt Multimedia、…...
转换符说明使用方法(在printf函数中)
目录 一些常见的转换说明及打印结果: printf()的转换说明修饰符 printf()函数打印数据指令时要与代打印数据的类型相匹配才行。 如%d %c %ld......这些符号叫做转换说明。代表着数据转化成显示的形式。 一些常见的…...
针灸-基本任脉督脉
这里写自定义目录标题 丈量 同身丈下针深浅一般入穴的方法成人 幼儿 不同入穴方式现代常用针概念十二经 纳天干**天干**地支表里关系筋络任脉中脘穴:梅花灸巨阙穴廉泉穴督脉长强腰俞命门阳关悬枢脊中筋缩眼诊 癫痫至阳消渴...

信息系统与信息化
1.1 信息系统与信息化 1.1.1 信息的基本概念 信息质量属性(掌握)信息传输模型 1.1.2 信息系统的基本概念1.1.3 信息化的基本概念 信息化的五个层次信息化基本内涵信息化的基本概念(了解)六要素关系图(掌握) 1.1.4 信息系统生命周…...

解决axios异步请求问题(异步变为同步)
遇到的问题 在目前一个需求中,我需要等待axios请求完成后,判断请求是否出现异常,然后来判断是否关闭弹窗 修改后大概代码如下: async submitForm() {let flag false//表单验证,默认通过let formValidation truethis…...

【Django】云笔记项目
一、介绍 用户可在系统中记录自己的笔记,用户的数据被存储在云笔记平台;用户和用户之间的数据为隔离存储(登陆后才能使用相关笔记功能,且只能查阅自己的笔记) 二、功能拆解 1、用户模块 注册:成为平台…...

LeetCode——1797. 设计一个验证系统
一、题目 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了,那么它会在 currentTime (可能与之前的 currentTime 不同&am…...

java Resource
参看本文前 你要先了解 spring中的 Autowired和Qualifier 注解 如果之前没有接触过 可以查看我的文章 java spring 根据注解方式按(类型/名称)注入Bean 然后 创建一个java项目 引入spring注解方式 所需要的包 然后 在src下创建包 我们这里直接叫 Bean 在Bean下创建包 叫UserD…...

ArkTS语法(声明式UI)
页面级变量的状态管理 装饰器装饰内容说明State基本数据类型,类,数组修饰的状态数据被修改时会触发组件的build方法进行UI界面更新。Prop基本数据类型修改后的状态数据用于在父组件和子组件之间建立单向数据依赖关系。修改父组件关联数据时,…...

自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改,删除,新增操作
Jmeter也可以连接mysql数据库,通过JDBC去调用数据库内的参数到HTTP请求中进行接口测试,可以说是相当方便 自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改&#…...

我的网站上线了!
最近有段时间没有写原创文章了,恰好这两天正在翻阅历史文章的时候,发现文章中的图片竟然裂了?顿时冒了一身冷汗,因为每逢遇到这种情况,动辄需要花费一周的时间迁移图片。。。。。。 当我直接访问图片 url 的时候&#…...

勒索病毒整体攻击态势简单分析
声明 本文是学习2018勒索病毒白皮书政企篇. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 勒索病毒整体攻击态势 2018年,勒索病毒攻击特点也发生了变化:2017年,勒索病毒由过去撒网式无差别攻击逐步转向以服务器定…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...