PMD规则开发实战:打造自己的代码质量检测工具

我正在参加「掘金·启航计划」

  1. PMD介绍:介绍 PMD。
  2. 安装和配置:如何安装和配置 PMD 插件以在的项目中使用。
  3. IDEA中如何使用PMD插件。
  4. Java项目中如何使用PMD。
  5. PMD规则开发介绍:介绍如何编写和使用自定义 PMD 规则。
  6. SonarQube如何集成PMD:SonarQube如何集成 PMD 以自动化代码质量检查。
  7. 如何降低误报:介绍如何避免 PMD 报告错误,并分析如何正确地使用 PMD 规则。

1. PMD介绍

PMD是一款开源的静态代码分析工具,用于检查Java、JavaScript、PLSQL和其他语言的代码中的潜在问题,如未使用的变量、未使用的方法、无效的if语句等。PMD通过解析代码,并应用各种规则来检查代码中的潜在问题。这些规则可以根据代码质量标准进行配置,并且可以自定义规则集合。PMD提供了多种输出格式,包括控制台输出、HTML、XML和JSON格式,方便用户进行代码分析和结果处理。此外,PMD还提供了Eclipse、IntelliJ IDEA等多种IDE的插件,可以方便地在IDE中进行代码分析和问题修复。通过使用PMD,开发人员可以更快地发现和修复代码中的问题,从而提高代码质量和可维护性。

2. 安装和配置

在Mac环境下,可以通过Homebrew包管理器安装PMD。下面是安装和配置PMD的步骤:

  1. 打开终端应用程序。
  2. 安装Homebrew包管理器。在终端中输入以下命令并按回车键:

/bin/bash -c "$(curl -fsSL raw.githubusercontent.com/Homebrew/in…%22)

  1. 使用Homebrew安装PMD。在终端中输入以下命令并按回车键:

brew install pmd

  1. 验证PMD是否已正确安装。在终端中输入以下命令并按回车键:

pmd -version

如果PMD已正确安装,则终端应该显示PMD的版本号。

  1. 配置PMD。可以通过创建一个PMD配置文件来配置PMD。在终端中输入以下命令并按回车键:

pmd config > ~/pmd.conf

该命令将在用户目录下创建一个名为pmd.conf的PMD配置文件。可以在该文件中指定要使用的规则和其他配置选项。

  1. 运行PMD。可以在终端中使用以下命令来运行PMD:

pmd -d /path/to/your/code -R /path/to/your/ruleset.xml -f text

命令分析:

  • -d选项指定要分析的代码的目录
  • -R选项指定规则集合的路径
  • -f选项指定输出格式(在这种情况下,输出将是文本格式,也可以根据需要更改这些选项。

3. IDEA中如何使用PMD插件

在IDEA中使用PMD插件可以帮助我们在开发过程中自动检测代码质量问题,提高代码质量和可维护性。下面是在IDEA中使用PMD插件并实践的步骤:

  1. 安装PMD插件:在IDEA中,打开Settings -> Plugins,搜索并安装PMD插件。
  2. 配置PMD插件:在IDEA中,打开Settings -> Other Settings -> PMD,配置PMD的相关参数,如PMD的安装路径、规则集、输出格式等。
  3. 运行PMD检测:在IDEA中,右键点击要检测的代码目录或文件,选择Run PMD检测,即可运行PMD检测并查看检测结果。
  4. 分析检测结果:在IDEA中,打开PMD检测结果窗口,可以查看PMD检测结果的详细信息,包括问题类型、问题所在的代码行数和文件名等,方便我们快速定位问题并进行修复。

4. Java项目中如何使用PMD

PMD这么强大,那么在开发项目中如何使用PMD进行代码扫描代码潜在问题呢?咱们就以Spring boot项目为例,看下如何实操。

Spring Boot项目中使用PMD的步骤:

  1. 在Spring Boot项目中添加PMD依赖。可以通过在pom.xml文件中添加以下代码来添加PMD依赖:
<dependency>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-pmd-plugin</artifactId>

<version>3.17.0</version>

</dependency>
  1. 配置PMD插件。可以在pom.xml文件中添加以下配置来定制PMD的行为:
<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-pmd-plugin</artifactId>

<version>3.17.0</version>

<executions>

<execution>

<goals>

<goal>check</goal>

</goals>

</execution>

</executions>

<configuration>

<rulesets>

<ruleset>/path/to/ruleset.xml</ruleset>

</rulesets>

<sourceEncoding>UTF-8</sourceEncoding>

<minimumTokens>30</minimumTokens>

<targetJdk>1.8</targetJdk>

<failOnViolation>true</failOnViolation>

</configuration>

</plugin>

</plugins>

</build>

这里配置了要使用的规则集、源代码编码、最小标记数量、目标JDK版本和违规时是否失败等选项。

  1. 运行PMD分析。可以使用Maven命令来运行PMD分析。例如,在命令行中执行以下命令:

mvn pmd:check

此命令将在项目中执行PMD分析,并生成一个名为“pmd.html”的HTML报告。可以在浏览器中打开该报告以查看分析结果。

  1. 分析结果展示。可以将PMD的分析结果显示在Spring Boot项目的页面上,以便开发人员查看并修复问题。可以将生成的HTML报告添加到Spring Boot项目的静态资源目录中,并使用Spring Boot内置的静态资源处理器来将其显示在页面上。

例如,在Spring Boot的应用类中添加以下代码:

@SpringBootApplication

public class MyApplication implements WebMvcConfigurer {

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/pmd/**").addResourceLocations("classpath:/static/pmd/");

}

public static void main(String[] args) {

SpringApplication.run(MyApplication.class, args);

}

}

此代码将创建一个静态资源处理器,并将生成的HTML报告添加到“/pmd”路径下。然后可以在Spring Boot应用程序的页面中添加一个链接来查看PMD分析结果。例如:

PMD Report

这将在页面中创建一个名为“PMD Report”的链接,单击该链接将打开PMD分析结果的HTML报告。

5. PMD规则开发介绍

PMD是一个非常强大的静态代码分析工具,它能够识别出代码中的各种问题,如潜在的错误、低效的代码、不良的编码习惯等等。然而,尽管PMD已经提供了很多内置的规则,但是在实际的项目中,我们往往会有一些特定的需求,需要自定义一些规则来满足我们的需求

5.1 开发步骤

PMD自定义规则开发的一般步骤:

  1. 了解PMD的API和规则配置格式:在开始开发自定义规则之前,需要了解PMD的API,以及PMD规则配置文件的格式和基本元素。
  2. 定义规则:确定想要编写的规则。应该选择在代码库中发现的最常见的代码问题之一,然后制定相应的规则。
  3. 编写规则代码:使用PMD API编写自定义规则代码。可以使用Java或其他语言编写规则。
  4. 测试规则:编写单元测试,以确保的规则按预期工作,并捕获所有预期和非预期的情况。
  5. 打包规则:将规则打包成JAR文件。这可以通过使用Maven或其他构建工具来完成。
  6. 部署规则:将JAR文件部署到PMD或PMD插件中。
  7. 配置规则:在PMD或PMD插件中配置的规则。这通常涉及指定JAR文件的位置和指定规则的名称。
  8. 运行规则:在的代码库中运行PMD,以应用的规则并查找违规的代码。

5.2 常用API

PMD提供了一系列API,可以用于开发自定义规则和扩展PMD的功能。以下是一些重要的PMD API:

  1. Rule:表示PMD规则的类。规则包括要检查的问题和相应的解决方案。可以通过继承AbstractRule类来创建自定义规则。
  2. RuleContext:表示PMD规则的执行上下文。该类维护当前分析的代码和规则集合,并提供一些实用程序方法,例如报告问题。
  3. Node:表示抽象语法树(AST)中的节点。 AST是代码的结构化表示,用于分析和转换代码。 PMD使用AST表示代码,并将其用于规则检查。
  4. Parser:表示将源代码解析为AST的类。PMD支持许多不同的语言和框架,因此有多种解析器可用。
  5. RuleViolation:表示违反规则的代码问题。当检查到违反规则的代码时,PMD将创建一个RuleViolation实例,并将其添加到RuleContext中。
  6. Renderer:表示将规则违规报告渲染为文本、HTML或其他格式的类。 PMD提供了许多不同的渲染器,可以根据需要选择。
  7. XPathRule:表示使用XPath表达式来查找问题的规则。XPath是一种用于选择XML文档中特定元素的语言。PMD可以将XPath应用于AST,以选择符合特定条件的节点。
  8. RuleChain:表示一组规则,按特定顺序执行。例如,可以将规则按复杂性排序,并将它们作为一个规则链执行。

5.3 自定义规则开发实践

下面是一个简单的DuplicateImports规则的实现(检查代码中是否有重复导入类)。

  1. 创建类

创建一个类,继承AbstractJavaRule类,该类提供了访问Java源代码的方法,如visit方法可以访问Java类或方法。

public class DuplicateImportsRule extends AbstractJavaRule {

@Override

public void visit(CompilationUnit node, Object data) {

    List<ImportDeclaration> imports = node.getImports();

    Map<String, ImportDeclaration> importMap = new HashMap<>();

    for (ImportDeclaration importDeclaration : imports) {

    String importName = importDeclaration.getNameAsString();

    if (importMap.containsKey(importName)) {

    addViolationWithMessage(data, importDeclaration, "Duplicate import: " + importName);

} else {

    importMap.put(importName, importDeclaration);

            }

        }

    }

}

在visit方法中,我们首先获取编译单元中的所有导入语句,然后遍历这些导入语句,并将其名称存储在一个Map中。如果遇到重复的名称,则将其添加到违规列表中。

  1. 配置规则

创建一个配置文件,定义规则的名称和描述,以及实现该规则的类。

<rule name="DuplicateImports"

language="java"

message="Duplicate import: {0}">

<description>

Checks for duplicate import statements.

</description>

<priority>3</priority>

<example>

<![CDATA[

// Good

import java.util.List;

import java.util.ArrayList;

// Bad

import java.util.List;

import java.util.List;

]]>

</example>

<ruleclass>

DuplicateImportsRule

</ruleclass>

</rule>

在这个配置文件中,我们定义了规则名称、描述、优先级、示例以及实现该规则的类。

  1. 添加规则

在PMD配置文件中添加自定义规则。

<rule ref="rulesets/java/imports.xml">

<exclude name="DuplicateImports"/>

<rule ref="rules/custom.xml/DuplicateImportsRule"/>

</rule>

在这个配置中,我们从默认规则集中排除了DuplicateImports规则,并添加了我们自定义的DuplicateImportsRule规则。

  1. 运行PMD

运行PMD来检查重复导入语句。

mvn pmd:check

6.SonarQube如何集成PMD

  1. 下载并安装SonarQube

可以在SonarQube官网上找到最新版本的下载链接。下载完成后,可以通过以下命令将其解压缩到/opt目录中:

sudo tar -xzf sonarqube-.tar.gz -C /opt

其中,是SonarQube的版本号。解压缩完成后,可以使用以下命令启动SonarQube服务器:

sudo /opt/sonarqube-/bin/macosx-universal-64/sonar.sh start

  1. 安装PMD插件

打开SonarQube管理页面并导航到“Marketplace”选项卡。搜索“PMD”,然后选择“PMD”插件并单击“Install”按钮。安装完成后,将在“Installed”选项卡中看到“PMD”插件。

  1. 配置PMD规则

在SonarQube管理页面中导航到“Quality Profiles”选项卡并单击“Create”按钮。为配置文件设置名称,并将“PMD”选为静态代码分析工具。选择要使用的规则集并单击“Create”按钮以创建新的配置文件。

  1. 配置Maven

在Maven项目的pom.xml文件中添加以下代码段以配置Maven插件:

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-pmd-plugin</artifactId>

<version>3.17.0</version>

<executions>

<execution>

<phase>check</phase>

<goals>

<goal>pmd</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

将Maven的PMD插件版本设置为3.17.0,并将它配置为在“check”阶段运行PMD分析。

  1. 运行PMD分析

在命令行中导航到Maven项目的根目录,并运行以下命令来运行PMD分析:

mvn clean verify sonar:sonar \

-Dsonar.projectKey=my_project_key \

-Dsonar.host.url=[http://localhost:9000](http://localhost:9000/) \

-Dsonar.login=my_token

其中,将“my_project_key”替换为SonarQube中的项目的唯一标识符;将“http://localhost:9000”替换为的SonarQube实例的URL;将“my_token”替换为的SonarQube访问令牌。

运行命令后,Maven将运行PMD分析并将结果上传到SonarQube服务器。可以登录到SonarQube管理页面并导航到的项目以查看PMD分析结果。

7. 如何降低误报

PMD也可能会导致一些误报,这可能会降低开发人员对其分析结果的信任度。下面是一些避免PMD误报的建议:

  1. 使用适当的规则集:PMD提供了多个规则集,每个规则集都有不同的目的。使用适当的规则集可以帮助减少误报的数量。
  2. 自定义规则集:PMD允许用户自定义规则集,并添加或删除规则。通过创建自定义规则集,可以根据项目需要定制规则,从而减少误报的数量。
  3. 配置规则参数:PMD的某些规则可以通过参数进行配置。例如,可以设置最大块大小或最大类长度等参数,以减少误报的数量。
  4. 排除特定文件或目录:如果代码中的某些文件或目录不需要进行PMD分析,可以通过在配置文件中添加exclude元素来排除这些文件或目录。
  5. 使用IDE插件:许多集成开发环境(IDE)都提供了PMD插件,这些插件可以帮助开发人员在编写代码时及时发现潜在的问题。使用IDE插件可以避免在构建过程中出现过多的误报。
  6. 定期检查和修复问题:虽然PMD可以帮助开发人员发现潜在问题,但最终修复问题仍需要人工干预。定期检查并修复问题可以减少误报的数量,并提高代码的质量。

猜你喜欢

转载自juejin.im/post/7234893047283597370