如果您有一个包含许多模块的多模块项目,并且您希望共享 PMD 规则集配置,以便每个模块使用相同的 PMD 规则,这是可能的,但需要进行一些设置。
该设置与为 Checkstyle 描述的设置非常相似,请参阅 Checkstyle 的多模块配置。
这个例子将使用同一个名为whizbang的神秘项目。这是该项目的结构:
whizbang |-- pom.xml |-- core | `-- pom.xml |-- gui | `-- pom.xml |-- jmx | `-- pom.xml `-- src
我们将从添加另一个子项目开始,该子项目将容纳 PMD 的通用配置。我们称之为build-tools。在其中,我们放置了我们想要在我们的 whizbang 模块之间共享的资源。在此示例中,我们将添加我们的自定义 PMD 规则集以供 PMD 插件使用。同一个子项目可用于容纳 Checkstyle 的共享配置。
whizbang |-- pom.xml |-- build-tools | |-- src | | `-- main | | `-- resources | | `-- whizbang | | `-- pmd-ruleset.xml | `-- pom.xml |-- core |-- gui |-- jmx `-- src
提示:将资源放入一个子目录中,您可以确保它是唯一的并且不会与其他任何人冲突。
构建工具的pom.xml文件应如下所示:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example.whizbang</groupId> <artifactId>build-tools</artifactId> <version>1.0</version> <name>Build Tools</name> </project>
示例pmd-ruleset.xml可能如下所示:
<?xml version="1.0"?> <ruleset name="whizbang PMD ruleset" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> <description> This ruleset defines the PMD rules for project "whizbang". </description> <rule ref="category/java/bestpractices.xml/AvoidUsingHardCodedIP" /> <rule ref="category/java/bestpractices.xml/CheckResultSet" /> <rule ref="category/java/bestpractices.xml/UnusedFormalParameter" /> <rule ref="category/java/bestpractices.xml/UnusedLocalVariable" /> <rule ref="category/java/bestpractices.xml/UnusedPrivateField" /> <rule ref="category/java/bestpractices.xml/UnusedPrivateMethod" /> <rule ref="category/java/codestyle.xml/UnnecessaryImport" /> <rule ref="category/java/errorprone.xml/AvoidBranchingStatementAsLastInLoop" /> <rule ref="category/java/errorprone.xml/AvoidDecimalLiteralsInBigDecimalConstructor" /> <rule ref="category/java/errorprone.xml/AvoidMultipleUnaryOperators" /> <rule ref="category/java/errorprone.xml/AvoidUsingOctalValues" /> <rule ref="category/java/errorprone.xml/BrokenNullCheck" /> <!-- many more rules are available at https://pmd.github.io/pmd-6.42.0/pmd_rules_java.html --> </ruleset>
现在我们可以在顶层pom.xml中包含 PMD 配置。
注意:您必须在pom.xml的<build>元素中指定对build-tools的插件依赖项。它在<reporting>元素中不起作用,因为<reporting>不支持插件依赖项。其余的配置在<reporting>元素中以正常方式完成。
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.example.whizbang</groupId> <artifactId>whizbang-parent</artifactId> <version>1.0</version> <packaging>pom</packaging> <name>WhizBang Parent</name> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.16.0</version> <configuration> <rulesets> <ruleset>whizbang/pmd-ruleset.xml</ruleset> </rulesets> <printFailingErrors>true</printFailingErrors> </configuration> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>com.example.whizbang</groupId> <artifactId>build-tools</artifactId> <version>1.0</version> </dependency> </dependencies> </plugin> </plugins> </build> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.16.0</version> <configuration> <rulesets> <ruleset>whizbang/pmd-ruleset.xml</ruleset> </rulesets> </configuration> <reportSets> <reportSet> <reports> <report>pmd</report> </reports> </reportSet> </reportSets> </plugin> </plugins> </reporting> <modules> <module>build-tools</module> <module>core</module> <module>jmx</module> <module>gui</module> </modules> </project>
完成此操作后,请确保不要在子模块中包含 Maven PMD 插件,因为它们的定义和配置将覆盖顶级父 pom 的定义。
根据上面的 PMD 插件配置,规则集的值将从类路径中解析。当build-tools JAR 被声明为插件的依赖项时,它被包含在类路径中。
最后,开始构建网站。
mvn site
或者通过验证运行 PMD 插件的检查目标:
mvn verify
现在,每个子项目都将使用相同的 PMD 设置和配置。