【问题标题】:Different Maven versions give different pmd results不同的 Maven 版本给出不同的 pmd 结果
【发布时间】:2014-06-13 05:40:51
【问题描述】:

我的一个项目使用了 maven-pmd-plugin,我发现在使用 Maven 3.0.5 和 Maven 3.2.1 时我收到了不同的结果。所有其他变量(Java 版本、操作系统版本、项目配置)。我也试过 Maven 3.1.1

我在跑步

mvn clean pmd:pmd

在命令行上

在 Maven 3.0.5 中,我收到一个警告:

<violation beginline="44" endline="307" begincolumn="8" endcolumn="1" rule="MoreThanOneLogger" ruleset="Java Logging" package="com.adobe.acs.commons.logging.impl" externalInfoUrl="${pmd.website.baseurl}/rules/java/logging-java.html#MoreThanOneLogger" priority="2">
Class contains more than one logger.
</violation>

在 Maven 3.2.1(和 3.1.1)中,我收到零警告。

我还尝试删除我的自定义规则集,现在将 maven-pmd-plugin 配置如下:

<plugin>
     <artifactId>maven-pmd-plugin</artifactId>
     <version>3.1</version>
     <configuration>
         <linkXRef>false</linkXRef>
         <rulesets>
             <ruleset>/rulesets/java/logging-java.xml</ruleset>
         </rulesets>
         <targetJdk>1.6</targetJdk>
     </configuration>
 </plugin>

结果相同。

【问题讨论】:

  • 在这两种情况下您是否使用相同版本的 Maven PMD 插件?

标签: java maven pmd


【解决方案1】:

了解您问题的更广泛背景有助于我在没有过多讨论的情况下找到解决方案。

各种 maven 版本之间的隐式依赖关系图存在差异,就像 maven 附带的默认值一样。我能够在本地重现此问题,当我为调试模式添加 -X 开关并在两个 maven 版本上运行 mvn clean pmd:pmd pmd:check -X 的差异时,我在 3.2.1 输出中看到以下导入,我认为是一个可能的后续候选者,因为它不仅与规则检查的日志记录类型有关,还因为我碰巧知道您正在使用 slf4j:

[DEBUG] 导入:org.slf4j.*

似乎 SLF4j 已添加到 plexus.core,这可能意味着 slf4j api 现在可用于所有插件类路径,而在此之前它需要插件在其自己的依赖项中导入库。

我查看了 PMD MoreThanOneLoggerRule 正在查找的内容,结果发现它只查找已解析类型的 Log4j 记录器和 JCL 记录器,如果无法解析类型,则查找名为“Logger”的任何内容:

http://pmd.sourceforge.net/pmd-5.1.1/xref/net/sourceforge/pmd/lang/java/rule/logging/MoreThanOneLoggerRule.html

解决方案似乎是在 pmd 插件依赖项中添加 slf4j API,如下所示:

<plugin>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <linkXRef>false</linkXRef>
        <rulesets>
            <ruleset>/rulesets/java/logging-java.xml</ruleset>
        </rulesets>
        <targetJdk>1.6</targetJdk>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
    </dependencies>
</plugin>

这会将 org.slf4j.Logger 放在 PMD 类路径中,以便它能够在分析期间解析类型。由于它既不是 Log4j Logger 也不是 JCL Logger,它不再关心是否拥有多个。

【讨论】:

  • 非常好的分析。我真的很佩服懂 Maven 的人。
猜你喜欢
  • 2016-04-22
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多