maven代码规范检查(checkstyle、findbugs、pmd)

前言

很多时候我们的代码写的不规范,比如没缩进、参数间没空格、导入的包没用到没删除、方法很长没有进行拆分、 直接对方法参数进行了赋值分配等等不规范的操作或写法。

为了规范代码并提高代码的质量,以及扫描代码检测潜在的不合理代码,我们可以使用一些插件来进行代码扫描分析。

一、使用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值