- PMD介绍:介绍 PMD。
- 安装和配置:如何安装和配置 PMD 插件以在的项目中使用。
- IDEA中如何使用PMD插件。
- Java项目中如何使用PMD。
- PMD规则开发介绍:介绍如何编写和使用自定义 PMD 规则。
- SonarQube如何集成PMD:SonarQube如何集成 PMD 以自动化代码质量检查。
- 如何降低误报:介绍如何避免 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的步骤:
- 打开终端应用程序。
- 安装Homebrew包管理器。在终端中输入以下命令并按回车键:
/bin/bash -c "$(curl -fsSL raw.githubusercontent.com/Homebrew/in…%22)
- 使用Homebrew安装PMD。在终端中输入以下命令并按回车键:
brew install pmd
- 验证PMD是否已正确安装。在终端中输入以下命令并按回车键:
pmd -version
如果PMD已正确安装,则终端应该显示PMD的版本号。
- 配置PMD。可以通过创建一个PMD配置文件来配置PMD。在终端中输入以下命令并按回车键:
pmd config > ~/pmd.conf
该命令将在用户目录下创建一个名为pmd.conf的PMD配置文件。可以在该文件中指定要使用的规则和其他配置选项。
- 运行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插件并实践的步骤:
- 安装PMD插件:在IDEA中,打开Settings -> Plugins,搜索并安装PMD插件。
- 配置PMD插件:在IDEA中,打开Settings -> Other Settings -> PMD,配置PMD的相关参数,如PMD的安装路径、规则集、输出格式等。
- 运行PMD检测:在IDEA中,右键点击要检测的代码目录或文件,选择Run PMD检测,即可运行PMD检测并查看检测结果。
- 分析检测结果:在IDEA中,打开PMD检测结果窗口,可以查看PMD检测结果的详细信息,包括问题类型、问题所在的代码行数和文件名等,方便我们快速定位问题并进行修复。
4. Java项目中如何使用PMD
PMD这么强大,那么在开发项目中如何使用PMD进行代码扫描代码潜在问题呢?咱们就以Spring boot项目为例,看下如何实操。
Spring Boot项目中使用PMD的步骤:
- 在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>
- 配置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版本和违规时是否失败等选项。
- 运行PMD分析。可以使用Maven命令来运行PMD分析。例如,在命令行中执行以下命令:
mvn pmd:check
此命令将在项目中执行PMD分析,并生成一个名为“pmd.html”的HTML报告。可以在浏览器中打开该报告以查看分析结果。
- 分析结果展示。可以将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自定义规则开发的一般步骤:
- 了解PMD的API和规则配置格式:在开始开发自定义规则之前,需要了解PMD的API,以及PMD规则配置文件的格式和基本元素。
- 定义规则:确定想要编写的规则。应该选择在代码库中发现的最常见的代码问题之一,然后制定相应的规则。
- 编写规则代码:使用PMD API编写自定义规则代码。可以使用Java或其他语言编写规则。
- 测试规则:编写单元测试,以确保的规则按预期工作,并捕获所有预期和非预期的情况。
- 打包规则:将规则打包成JAR文件。这可以通过使用Maven或其他构建工具来完成。
- 部署规则:将JAR文件部署到PMD或PMD插件中。
- 配置规则:在PMD或PMD插件中配置的规则。这通常涉及指定JAR文件的位置和指定规则的名称。
- 运行规则:在的代码库中运行PMD,以应用的规则并查找违规的代码。
5.2 常用API
PMD提供了一系列API,可以用于开发自定义规则和扩展PMD的功能。以下是一些重要的PMD API:
- Rule:表示PMD规则的类。规则包括要检查的问题和相应的解决方案。可以通过继承AbstractRule类来创建自定义规则。
- RuleContext:表示PMD规则的执行上下文。该类维护当前分析的代码和规则集合,并提供一些实用程序方法,例如报告问题。
- Node:表示抽象语法树(AST)中的节点。 AST是代码的结构化表示,用于分析和转换代码。 PMD使用AST表示代码,并将其用于规则检查。
- Parser:表示将源代码解析为AST的类。PMD支持许多不同的语言和框架,因此有多种解析器可用。
- RuleViolation:表示违反规则的代码问题。当检查到违反规则的代码时,PMD将创建一个RuleViolation实例,并将其添加到RuleContext中。
- Renderer:表示将规则违规报告渲染为文本、HTML或其他格式的类。 PMD提供了许多不同的渲染器,可以根据需要选择。
- XPathRule:表示使用XPath表达式来查找问题的规则。XPath是一种用于选择XML文档中特定元素的语言。PMD可以将XPath应用于AST,以选择符合特定条件的节点。
- RuleChain:表示一组规则,按特定顺序执行。例如,可以将规则按复杂性排序,并将它们作为一个规则链执行。
5.3 自定义规则开发实践
下面是一个简单的DuplicateImports规则的实现(检查代码中是否有重复导入类)。
- 创建类
创建一个类,继承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中。如果遇到重复的名称,则将其添加到违规列表中。
- 配置规则
创建一个配置文件,定义规则的名称和描述,以及实现该规则的类。
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>
在这个配置文件中,我们定义了规则名称、描述、优先级、示例以及实现该规则的类。
- 添加规则
在PMD配置文件中添加自定义规则。
ini
复制代码
<rule ref="rulesets/java/imports.xml"> <exclude name="DuplicateImports"/> <rule ref="rules/custom.xml/DuplicateImportsRule"/> </rule>
在这个配置中,我们从默认规则集中排除了DuplicateImports规则,并添加了我们自定义的DuplicateImportsRule规则。
- 运行PMD
运行PMD来检查重复导入语句。
mvn pmd:check
6.SonarQube如何集成PMD
- 下载并安装SonarQube
可以在SonarQube官网上找到最新版本的下载链接。下载完成后,可以通过以下命令将其解压缩到/opt目录中:
sudo tar -xzf sonarqube-.tar.gz -C /opt
其中,是SonarQube的版本号。解压缩完成后,可以使用以下命令启动SonarQube服务器:
sudo /opt/sonarqube-/bin/macosx-universal-64/sonar.sh start
- 安装PMD插件
打开SonarQube管理页面并导航到“Marketplace”选项卡。搜索“PMD”,然后选择“PMD”插件并单击“Install”按钮。安装完成后,将在“Installed”选项卡中看到“PMD”插件。
- 配置PMD规则
在SonarQube管理页面中导航到“Quality Profiles”选项卡并单击“Create”按钮。为配置文件设置名称,并将“PMD”选为静态代码分析工具。选择要使用的规则集并单击“Create”按钮以创建新的配置文件。
- 配置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分析。
- 运行PMD分析
在命令行中导航到Maven项目的根目录,并运行以下命令来运行PMD分析:
ini
复制代码
mvn clean verify sonar:sonar \ -Dsonar.projectKey=my_project_key \ -Dsonar.host.url=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误报的建议:
- 使用适当的规则集:PMD提供了多个规则集,每个规则集都有不同的目的。使用适当的规则集可以帮助减少误报的数量。
- 自定义规则集:PMD允许用户自定义规则集,并添加或删除规则。通过创建自定义规则集,可以根据项目需要定制规则,从而减少误报的数量。
- 配置规则参数:PMD的某些规则可以通过参数进行配置。例如,可以设置最大块大小或最大类长度等参数,以减少误报的数量。
- 排除特定文件或目录:如果代码中的某些文件或目录不需要进行PMD分析,可以通过在配置文件中添加exclude元素来排除这些文件或目录。
- 使用IDE插件:许多集成开发环境(IDE)都提供了PMD插件,这些插件可以帮助开发人员在编写代码时及时发现潜在的问题。使用IDE插件可以避免在构建过程中出现过多的误报。
- 定期检查和修复问题:虽然PMD可以帮助开发人员发现潜在问题,但最终修复问题仍需要人工干预。定期检查并修复问题可以减少误报的数量,并提高代码的质量。
作者:软件质量保障
链接:https://juejin.cn/post/7234893047283597370