首页 > 代码库 > 1. PMD 使用,编译和自定义规则
1. PMD 使用,编译和自定义规则
一 PMD简介
PMD是一款代码静态检查工具,可以检查出很多代码中潜在的bug以及让人感到疑惑的代码,具体大家可以百度下。
二 PMD源代码下载
下载地址:
https://github.com/pmd/pmd/tree/pmd/5.5.x
需要注意的是注意选择branch,一般选择最新的branch;然后可以用git clone下来,或者直接下载zip压缩包。
如下:
从上图也可以看到,pmd支持的语言有很多,java的检测那就是在pmd-java里面。
三 maven下载和环境变量配置
参考网址:
http://blog.csdn.net/jiuqiyuliang/article/details/45390313
下载maven
地址:maven下载
配置MAVEN_HOME和path
检测maven环境:开始菜单->运行->cmd->mvn -v
如下图:
四 配置JDK
这个网上资料太多了,就不细说了, 比如:
http://www.cnblogs.com/smyhvae/p/3788534.html
五 编译PMD
在home目录配置 ~/.m2/toolchains.xml 这里我发现分两种情况:
第一种,我在本地装了git bash,所以打开git bash后,敲入cd ~,如下图:
那这种的话直接在c/users/rongwei.huang目录创建./m2/toolchains.xml文件
可以把PMD源代码目录下example-toolchains.xml文件拷贝过去,改成toolchains.xml
如下:
修改toolchains.xml,主要就是配置JDK版本和路径,我使用JDK1.8编译,所以配置如下:
<?xml version="1.0" encoding="UTF8"?> <toolchains> <!-- place this file in ${user.home}/.m2/toolchains.xml --> <!-- adjust the paths to jdkhome --> <toolchain> <type>jdk</type> <provides> <version>1.8</version> </provides> <configuration> <jdkHome>/path/to/jdk/1.8</jdkHome> <!-- Linux --> <jdkHome>/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home</jdkHome> <!-- MacOSX --> <jdkHome>h:\\Android\\jdk1.8.0_25</jdkHome> <!-- Windows --> </configuration> </toolchain> </toolchains>
第二种,就是没有安装类似git bash这种linux环境软件,这种我没有试过,别的帖子有介绍:
PMD编译
2. 编译PMD源代码
配置完toolchains.xml之后,在PMD源代码目录打开命令行,执行
mvn clean package
如下图:
3. 编译遇到问题
在编译的时候,我遇到下面两个问题:
a. java doc 编译失败
可以参考这篇帖子解决方法: PMD Java doc ‘->‘编译失败
b. 测试项EcmascriptTokenizerTest没有通过
我直接把它注释掉了
4. 编译成功,查看结果
在PMD源代码pmd-dist目录,target文件夹查看zip文件
5. 解压PMD
拷贝pmd-bin-5.5.8-SNAPSHOT.zip到一个没有中文字符的路径,然后解压。
解压后,主要包括bin和lib两个文件夹
bin是可执行程序,下面我们会用里面的程序编写自定义规则。
lib包含很多jar包,jar包里面包含规则的实现以及描述的xml文件。
六 自定义PMD规则
可以参考这篇帖子: 自定义PMD规则, 不过也说说自己的操作方法
eclipse打开PMD源代码工程
为了写代码方便一点,可以用Eclipse来打开,具体是:
File->New->Java Project->去掉Use default location->选择PMD的源代码路径->finish
2. 创建规则检测类
在java规则里面创建一个新的规则类WhileLoopMustUseBracesRule.java,继承自AbstractJavaRule.java
路径:
pmd-source\pmd-java\src\main\java\net\sourceforge\pmd\lang\java\rule\
如上面那个帖子说的,我们要创建一个规则检测java代码while循环必须有{}
也就是这种写法是错误的:
while(condition)
i++;
需要改成这样
while(condition) {
i++;
}
所以,我们需要一个类来检测它。
如下:
这个类主要重写了检测方法visit,至于为什么这么写,可以参考上面这个帖子:自定义PMD规则
3. 创建描述性xml
在pmd-source\pmd-java\src\main\resources\rulesets\java\目录下创建自定义规则的描述性xml,在这个目录可以看到很多已经有的xml,比如:
其中android.xml表示的是针对android的检测,basic.xml表示基本通用的检测。
那我们也可以把basic.xml拷贝一份,改成自定义的xml,比如mycustomrules.xml
如下:
<?xml version="1.0"?> <ruleset name="mycustomrule" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> <description>custom rule</description> <rule name="WhileLoopsMustUseBracesRule" language="java" since="5.6" message="while loop must has braces as first element you are in error!!!" class="net.sourceforge.pmd.lang.java.rule.WhileLoopMustUseBracesRule" externalInfoUrl="${pmd.website.baseurl}/rules/java/basic.html#JumbledIncrementer"> <description>while loop must has braces as first element</description> <priority>3</priority> <example> <![CDATA[ class Example { void bar() { while(baz) //need has {} buz.doSomething(); } } ]]> </example> </rule> </ruleset>
上面有几个描述性信息:
description: 自定义规则描述
rule name: 名称
language: java
since: 表示从哪个pmd版本开始有这个规则
message: 用来提示用户出错的描述性信息
class: 表示具体用来检测的类,也就是我们自定义的那个类
externalInfoUrl: 在生成的html报告中,用来给用户点击跳转到帮助页面的链接。在帮助页面有这个错误的更详细的描述信息;
description: 出错描述
priority: 优先级
example: 出错示例
4. 编译打包
在PMD源代码下面的pmd-java目录,打开命令行,执行
mvn clean package
在编译目录pmd-source\pmd-java\target\下查看编译结果
pmd-java-5.5.8-SNAPSHOT.jar
可以用压缩工具查看这个jar是否包含了我们自定义的xml和java文件
5. 拷贝生成的jar到PMD-bin解压目录
在上面第五步,我们编译了PMD源代码,并且生成了pmd bin压缩包。然后拷贝到了一个没有中文字符的目录。
那我们现在继续把java编译的jar包,拷贝过去,路径是pmd-bin的lib下面,如下:
6. 利用自定义规则检测java代码
在pmd-bin目录打开命令行,执行
pmd.bat -d e:\work_space\Android-Prototype\app\src\main -f html -R java-mycustomrules
解释下参数:
-d: 表示你要检查的java源代码目录
-f: 表示输出的内容格式是html
-R: 表示要使用的规则,上面表示的是java里面的mycustomrules规则
其中hello pmd使我们打印的log:
System.out.println("hello pmd");
上面检测到一个错误BaseActivity.java 78行有个while循环没有用{}
代码如下:
七 用xpath语法自定义规则
这个可以参考帖子 xpath自定义规则
八 在AndroidStudio中配置PMD
在线安装
File->Settings->Plugins->pmd->Browse repositories,找到后直接点install,然后重启AndroidStudio。
但是这种方法我没有成功,报错是打开zip file失败。
本地安装
把安装包下载到本地,然后
File->Settings->Plugin->install plugin from disk->重启AndroidStudio
一共需要安装两个插件,一个是pmd,还有一个是pmd依赖的pmd core;下载地址如下:
gradle-android-metric-pmd.jar
gradle-android-metric-core.jar
增加配置模块
可以新建一个module为config,在config module的quality.gradle里面配置pmd的task,如下:
apply plugin: ‘pmd‘
check.dependsOn ‘pmd‘ task pmd(type: Pmd) { ruleSetFiles = files("${project.rootDir}/config/quality/pmd/java/basic.xml", //基本代码规范 "${project.rootDir}/config/quality/pmd/java/android.xml") //android相关 ruleSets = [] ignoreFailures = true source ‘src‘ include ‘**/*.java‘ exclude ‘**/gen/**‘ reports { xml.enabled = true html.enabled = true xml { destination "${project.buildDir}/reports/pmd/pmd.xml" } html { destination "${project.buildDir}/reports/pmd/pmd.html" } } }
简单描述下这几个属性:
ruleSetFiles: 自定义的检测文件集合
ruleSets=[]: 表示不用默认的检测xml,使用自定义的
ignoreFailures=true: 表示如果有错误,那么编译报错;如果是false,则只是输出错误报表,并不会中断编译。
source:目录
include: 包含文件
exclude: 不包含的文件
reports:输出报表的路径, xml.enabled表示是否输出xml。
在app的build.gradle增加对这个模块gradle的引用
apply from: ‘../config/quality.gradle‘
执行编译
可以右击AndroidStudio的gradle里面pmd这个task(如果没有的话,可以build->rebuild project,在右边Gradle Projects里面刷新下)
或者在项目根目录,执行gradle pmd
附录:
下面是pmd的一些相关网址
PMD github源代码 下载时注意branch
PMD介绍 包括大部分PMD检查分类的介绍,比如basic是干什么
PMD自定义规则的实现
PMD官网
安装maven
PMD java doc编译失败
谢谢上面的博主。
本文出自 “www.bogo.com” 博客,请务必保留此出处http://483181.blog.51cto.com/473181/1922605
1. PMD 使用,编译和自定义规则