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

PMD规则开发实战:打造自己的代码质量检测工具PMD 介绍 介绍 PMD 安装和配置 如何安装和配置 PMD 插件以在的项目中使用 IDEA 中如何使用 PMD 插件 Java 项目中如何使用 PMD PMD 规则开发介绍 介绍如何编写和使用自定义 PMD 规则 SonarQube 如何集成 PMD SonarQube 如何集成 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依赖:
 

讯享网

xml

复制代码

<dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.17.0</version> </dependency>

  1. 配置PMD插件。可以在pom.xml文件中添加以下配置来定制PMD的行为:
讯享网

xml

复制代码

<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的应用类中添加以下代码:

 

typescript

复制代码

@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类或方法。


讯享网

讯享网

scala

复制代码

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. 配置规则

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

 

xml

复制代码

<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配置文件中添加自定义规则。

讯享网

ini

复制代码

<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插件:

 

xml

复制代码

<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分析:

讯享网

ini

复制代码

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可以帮助开发人员发现潜在问题,但最终修复问题仍需要人工干预。定期检查并修复问题可以减少误报的数量,并提高代码的质量。

作者:软件质量保障
链接:https://juejin.cn/post/
 

小讯
上一篇 2025-03-29 07:32
下一篇 2025-01-10 19:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/71949.html