2014-06-12 144 views
1

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

我在命令行上运行

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,现在有行家-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

在这两种情况下你使用的是相同版本的Maven PMD插件吗? –

回答

1

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

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

[调试信息]导入:org.slf4j * < plexus.core

看来,加入到SLF4J plexus.core,这可能意味着SLF4J API是提供给所有插件类路径现在,而在此之前,将需要的插件IM将该库移植到它自己的依赖项中。

我去看看有什么PMD MoreThanOneLoggerRule期待了,事实证明它只会寻找Log4j的记录器和记录仪JCL通过解析式,并命名为“记录仪”,如果它不能解析的任何类型:

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

的解决方案似乎是添加SLF4J API就在PMD插件的依赖,如:

<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类路径,使其能够在某个时间解决类型alysis。既然它既不是Log4j Logger或JCL Logger,也不再关心它们中的多个。

+0

非常好的分析。我真的很佩服懂Maven的人。 –

相关问题