程序人生 A log of my life

Maven集成PMD

PMD和Find-bugs是Java里最常用的两个静态检查工具,前者基于源码,后者基于字节码,两个都用效果不过,先说说PMD。

Maven集成

虽然PMD很强大,可是文档写的非常糟糕,我试了很久,其实就是为了下面一段代码

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-pmd-plugin</artifactId>
  <configuration>
     <excludes>
     <exclude>**/com/xxx/**/*.java</exclude>
     <exclude>**/org/**/*.java</exclude>
   </excludes>
   <rulesets>
    <ruleset>/rulesets/java/strictexception.xml</ruleset>
    <ruleset>${basedir}/pmd-rules.xml</ruleset>
   </rulesets>                    
  </configuration>
</plugin>

如果不想在某些构建命令不执行PMD,可以增加一个Maven参数-Dpmd.skip=true

自定义规则

PMD可以通过Java或Xpath自定义规则,Xpath很方便灵活,上面例子中就引用了一个自定义规则pmd-rules.xml

<?xml version="1.0"?>
<ruleset name="MyRules">
<rule name="RestApiThrowException" message="REST API should not throw exception" class="net.sourceforge.pmd.lang.rule.XPathRule" language="java">
 <properties>
  <property name="xpath">
   <value><![CDATA[
//MethodDeclaration[../Annotation//Name[@Image='Path' or @Image='GET' or @Image='POST']]/NameList
   ]]></value>
  </property>
 </properties>
</rule>
</ruleset>

设计规则

定义一个XPath规则是一个反复调整的过程,通常借助于PMD Designer来做:

  • 下载标准PMD版本(含PMD Designer)
  • 使用PMD Designer分析源码,得到AST
  • 验证自己的XPath规则

参考规则

PMD自带的规则很多,在PMD标准版上,展开lib/pmd-java-xxx.jar,里面的rulesets/java下就保存了所有的自带rule,学习这些rule,也可以更好的帮助自定义规则的设计。