maven - 为什么 PMD 在命令行中可以使用,但在 Maven 中却不起作用?

标签 maven pmd

经过多年成功地将 PMD 与 Ant 结合使用,我现在尝试让 PMD 在 Maven 中工作,但没有成功。

为了说明我的问题,我创建了一个简单的 Maven 系统(基于 Maven 教程“my-app”hello world 程序)。它的不同之处仅在于包含一行代码,该代码行应使用基本规则集触发 PMD 错误:

Boolean bar = new Boolean("true");

当我从命令行运行 PMD 时,代码中的问题就暴露出来了:

run.sh pmd -d src/main/java -f text -R rulesets/java/basic.xml -language java
maven-pmd-example/src/main/java/com/mycompany/app/App.java:11   Avoid instantiating Boolean objects; reference Boolean.TRUE or Boolean.FALSE or call Boolean.valueOf() instead.

但是,当我从 Maven 中运行 pmd 时,代码中的问题并未显现出来:

-> mvn pmd:check
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-pmd-plugin:2.7.1:check (default-cli) @ my-app >>>
[INFO] 
[INFO] --- maven-pmd-plugin:2.7.1:pmd (pmd) @ my-app ---
[WARNING] Unable to locate Source XRef to link to - DISABLED
[INFO] 
[INFO] <<< maven-pmd-plugin:2.7.1:check (default-cli) @ my-app <<<
[INFO] 
[INFO] --- maven-pmd-plugin:2.7.1:check (default-cli) @ my-app ---
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.375s
[INFO] Finished at: Sun Feb 03 15:38:02 HST 2013
[INFO] Final Memory: 12M/309M
[INFO] ------------------------------------------------------------------------

这是 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-app</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-pmd-plugin</artifactId>
        <version>2.7.1</version>
        <executions>
          <execution>
            <phase>verify</phase> 
            <goals>
              <goal>check</goal> 
            </goals>
          </execution>
        </executions>
        <configuration>
          <verbose>true</verbose>
          <minimumPriority>0</minimumPriority>
          <rulesets>
            <ruleset>rulesets/basic.xml</ruleset>
          </rulesets>
          <targetJdk>1.6</targetJdk>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jxr-plugin</artifactId>
        <version>2.3</version>
      </plugin>
    </plugins>
  </build>
</project>

我已将此示例系统上传到 GitHub,以便您可以看到整个示例系统(如果您愿意,还可以下载/使用它):

https://github.com/philipmjohnson/maven-pmd-example

最佳答案

这是因为您已将 minimumPriority 设置为 0,这将有效地阻止 PMD 评估任何规则(有关优先级的讨论,请参阅 to this SO question)。

refer to this section PMD 插件的目标文档以获取更多信息。

我建议修改配置,将 minimumPriority 设置为 2,这样您就可以使 BooleanInstantiation 的构建失败。

希望这有帮助!

关于maven - 为什么 PMD 在命令行中可以使用,但在 Maven 中却不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14679491/

相关文章:

java - Gradle PMD 插件获取 java.lang.NoClassDefFoundError : org/w3c/dom/ElementTraversal

java - pmd:DataflowAnomalyAnalysis 会为增强型 for 循环生成误报吗?

android - APKLIB 未安装在 Maven Repo 中

java - RuntimeEnvironmentPropertiesConfigurer 问题 - 在 tomcat 上运行 Broadleaf 管理时

java - Jena NoClassDefFoundError 与 Maven

java - 无法使用 jersey-quickstart-webapp 原型(prototype)创建新的 Maven 项目

java - 使用 App Engine 和 Maven 生成 pom.xml 文件

java - Joshua Bloch 的 Builder 模式和 PMD 警告

java - Gradle 6.0 和 PMD 6.15 集成,如何在超出允许的违规限制时使构建失败

java - 对象不是本地创建的