不同的Maven版本提供不同的pmd结果

时间:2014-06-12 18:05:19

标签: java maven pmd

我的一个项目使用了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)中,我收到零警告。

我也尝试删除我的自定义rulset,现在配置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>

结果相同。

1 个答案:

答案 0 :(得分:1)

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

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

  

[DEBUG]导入:org.slf4j。*&lt; plexus.core

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

我去看看PMD MoreThanOneLoggerRule正在查找什么,结果发现它只能通过已解析的类型查找Log4j记录器和JCL记录器,以及任何名为&#34; Logger&#34;如果它无法解决类型:

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,它不再关心拥有多个Log4j Logger。