多模块配置

如果您有一个包含许多模块的多模块项目,并且您希望共享 PMD 规则集配置,以便每个模块使用相同的 PMD 规则,这是可能的,但需要进行一些设置。

该设置与为 Checkstyle 描述的设置非常相似,请参阅 Checkstyle 的多模块配置

这个例子将使用同一个名为whizbang的神秘项目。这是该项目的结构:

whizbang
|-- pom.xml
|-- core
|   `-- pom.xml
|-- gui
|   `-- pom.xml
|-- jmx
|   `-- pom.xml
`-- src

为 PMD 规则集创建子项目

我们将从添加另一个子项目开始,该子项目将容纳 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 设置和配置。