maven代码规范检查
前言
很多时候我们的代码写的不规范,比如没缩进、参数间没空格、导入的包没用到没删除、方法很长没有进行拆分、 直接对方法参数进行了赋值分配等等不规范的操作或写法。
为了规范代码并提高代码的质量,以及扫描代码检测潜在的不合理代码,我们可以使用一些插件来进行代码扫描分析。
一、使用checkstyle插件
1. maven-checkstyle-plugin 介绍
maven-checkstyle-plugin 是 maven 提供的一个插件,用于扫描代码检测不合理需要改进的差代码,简单来说就是代码规范检查。
举个例子:
GitHub 就用它在提交和拉取请求时审核代码库的一致性(例如缩进规则等)。GitHub 的 Actions 等 CI/CD 系统中就使用了这个东西,当你在 GitHub 上 fork 了一个开源项目,然后修改一些代码后给原项目作者提了一个 PR 请求,原作者同意后GitHub CI就会用这个东西构建检查代码缩进和代码规范是否有不合理的地方。
2. 接入方式
在 pom.xml 中引入如下插件依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.2.1</version>
</plugin>
</plugins>
</build>
maven-checkstyle-plugin 自带两套扫描代码的规则,一套是 Sun 定义的 sun_checks.xml ,一套是由谷歌定义的 google_checks.xml。
像上面那样不指定扫描规则,则默认采用 sun_checks.xml ,
如果你想指定使用 google_checks.xml 规则扫描代码可以像下面这样引入插件依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<configLocation>google_checks.xml</configLocation>
</configuration>
</plugin>
</plugins>
</build>
如果你想采用自定义的扫描规则,请在你的 pom.xml 同级目录下新建 checkstyle.xml 文件并在其中配置你的规则。
然后修改 pom.xml 中 maven-checkstyle-plugin 插件的 configLocation 配置 checkstyle.xml ,就像上面的 google_checks.xml 一样。
网上有很多自定义的 checkstyle.xml 规则,例如:
3. 如何排除某个类、包下面的文件不进行检查
使用suppressionsLocation
您必须使用一个明确的suppressions.xml配置文件并从您的配置中激活它:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<!-- checkstyle自定义文件位置 ->
<configLocation>config/checkStyle/checkstyle.xml</configLocation>
<!-- 不需要检测的类的文件的位置 排除用这个 ->
<suppressionsLocation>config/checkStyle/suppressions.xml</suppressionsLocation>
[...]
用于排除目标文件夹的禁止文件如下所示:
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<!-- files 代表你想对项目中的哪个类进行过来 ->
<!-- checks 代表你想过滤掉哪种检查 ->
<!-- 以下为例子 ->
<suppressions>
<suppress files="[/\\]target[/\\]" checks=".*" />
<suppress files="com.mapper" checks="Javadoc" />
<suppress files="com.dto" checks="Javadoc" />
<suppress files="HelloResource.java" checks="AvoidStarImport" />
<suppress files="[\\/]com[\\/]sgy[\\/]ssm[\\/]" checks="[a-zA-Z0-9]*"/>
<suppress files="[\\/]resources[\\/]" checks="[a-zA-Z0-9]*"/>
<suppress files=".*(Switch|Enum|ErrorCode).java" checks="[a-zA-Z0-9]*"/>
</suppressions>
4. 如何关闭
第一种:直接注释掉或者删除maven-checkstyle-plugin依赖
第二种.配置skip 设置为true
在 pom.xml 文件中为特定的插件或目标设置 skip 属性。当设置为 true 时,Maven 将跳过该插件或目标的执行。
以下是禁用checkstyle在pom中定义如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
参考:
【1】提升代码质量,使用插件对 java 代码进行扫描检查分析
https://blog.youkuaiyun.com/qq_33697094/article/details/129709360
【2】在Maven Checkstyle插件报告中排除类
https://www.thinbug.com/q/2362652
【3】代码规范:项目中引入checkstyle并排除需要扫描的包
https://blog.youkuaiyun.com/u013066244/article/details/116996518
【4】【maven配置文件系列】FLINK Suppressions.xm
https://blog.youkuaiyun.com/wang2leee/article/details/132536908
二、使用findbugs插件
1.findbugs-maven-plugin介绍
FindBugs是一个静态分析工具,它将字节码(因此需要先编译)与一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析。简而言之,FindBugs其实就是对编译后的class进行扫描,藉以发现一些隐藏的bug。比较典型的,如引用了空指针(null pointer), 特定的资源(db connection)未关闭,等等。如果用人工检查的方式,这些bug可能很难才会被发现,或许直到运行时才发现…所以当我们用findbugs除掉了这些典型的bug后,我们系统的稳定度将会上一个新的台阶。
另一方面,对于一个初入职场的新coder而言,适应findbugs不仅能减少bug的数量,更有利于提升编码能力,写出高质量的代码,从而养成较好的编程习惯。
2. 接入方式
在 pom.xml 引入如下插件依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.2.1</version>
</plugin>
</plugins>
</build>
3. 如何排除某个类、包下面的文件不进行检查
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<!--findbugs在此处配置需要忽略的-->
<excludeFilterFile>conf/findbugs-exclude-filter.xml</excludeFilterFile>
</configuration>
</plugin>
</plugins>
</build>
对于findbugs-exclude-filter.xml的四种过滤配置
过滤类(常用的是这种)
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Class name="com.missxxxx.proscenium.plugin.misconf.ProsceniumConfig" />
</Match>
</FindBugsFilter>
过滤包(尽量不要过滤整个包)
老项目在接入findbugs时,尽量不要过滤整个包,而是把现有的类逐个过滤即可,这样不妨碍新增加的文件参与扫描
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Package name="com.missxxxx.proscenium.plugin.misconf" />
</Match>
</FindBugsFilter>
过滤方法
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Class name="com.missxxxx.proscenium.service.CartShowServiceImpl" />
<Method name="getResultData"></Method>
</Match>
</FindBugsFilter>
过滤异常
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<!--装箱后拆箱紧接着装箱,忽略不处理 -->
<!-- Boxed value is unboxed and then immediately reboxed-->
<Package name="~.*" />
<Bug pattern="BX_UNBOXING_IMMEDIATELY_REBOXED" />
</Match>
</FindBugsFilter>
如果有多个包/类/方法需要过滤,就加多个Match标签即可。
参考:
【1】Findbugs maven 插件使用
https://blog.youkuaiyun.com/qq_34595352/article/details/117038779
三、使用pmd插件
1.maven-pmd-plugin介绍
PMD是一款开源的静态代码分析工具,用于检查Java、JavaScript、PLSQL和其他语言的代码中的潜在问题,如未使用的变量、未使用的方法、无效的if语句等。PMD通过解析代码,并应用各种规则来检查代码中的潜在问题。这些规则可以根据代码质量标准进行配置,并且可以自定义规则集合。PMD提供了多种输出格式,包括控制台输出、HTML、XML和JSON格式,方便用户进行代码分析和结果处理。此外,PMD还提供了Eclipse、IntelliJ IDEA等多种IDE的插件,可以方便地在IDE中进行代码分析和问题修复。通过使用PMD,开发人员可以更快地发现和修复代码中的问题,从而提高代码质量和可维护性。
2. 接入方式
在 pom.xml 引入如下插件依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.8</version>
</plugin>
</plugins>
</build>
3. 如何排除某个类、包下面的文件不进行检查
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.8</version>
<configuration>
<excludes>
<exclude>**/tController.java</exclude>
<exclude>**/tService.java</exclude>
<exclude>**/tServiceImpl.java</exclude>
<exclude>**/StringUtilPlus.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
参考:
【重点】
https://blog.youkuaiyun.com/A_yonga/article/details/129029765
https://maven.org.cn/plugins/maven-pmd-plugin/usage.html
【1】java - 从 maven 插件中的 PMD 中删除单个规则检查
https://stackoverflow.org.cn/questions/16021453
【2】PMD规则开发实战:打造自己的代码质量检测工具
https://juejin.cn/post/7234893047283597370
【3】maven-pmd-plugin 配置
https://blog.youkuaiyun.com/hety119/article/details/84880559
【4】静态代码检查工具PMD安装、使用
https://blog.youkuaiyun.com/panghuangang/article/details/132567825