Maven集成PMD
25 Feb 2017PMD和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,也可以更好的帮助自定义规则的设计。