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年,勒索病毒由过去撒网式无差别攻击逐步转向以服务器定…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
