编写自己的PMD规则

目标:搭建基于maven的app工程,编写自定义PMD规则,可运行单元测试,可debug。


一、环境搭建

1. 在想要建立工程的地方,运行 "mvn archetype:create -DgroupId=com.alipay.codecheck -DartifactId=codecheck" 命令搭建一个app工程


2. 修改根目录pom.xml,管理jar包依赖:

a) 将junit版本修改为4.4

b) 添加ant,asm,jaxen的jar包依赖,这些是为后续pmd源码准备的。



ant
ant
1.6.5




asm
asm
3.1




jaxen
jaxen
1.1-beta-10

c) 添加插件,设置maven时下载jar包源代码




org.apache.maven.plugins
maven-eclipse-plugin
2.8

true



 

3. 将pmd源码放到工程当中

a) 将net.sourceforge.pmd源码放到src/main/java/下

b) 将rulesets文件夹放到src/main/resources/下


4. 检测代码

a) 在工程根目录建立code文件夹,将被检测代码放到其中

b) 编写PMDRunner类:

/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2012 All Rights Reserved.
 */
package com.alipay.codecheck;


import net.sourceforge.pmd.PMD;
import org.junit.Test;


/**
 * PMD tool runner
 * @author sunjian
 * @version $Id: PMDRunner.java, v 0.1 2012-2-16 上午09:10:37 sunjian Exp $
 */
public class PMDRunner {
    /** path of source files to be checked*/
    private static final String INPUT_PATH         = "code";


    /** report type */
    private static final String REPORT_FORMAT_TYPE = "xml";


    /** path of rule files */
    private static final String RULE_SETS          = "rulesets/myrule.xml";


    /**
     * Run pmd tool
     */
    @Test
    public void test_runPMD() {
        String[] args = { INPUT_PATH, REPORT_FORMAT_TYPE, RULE_SETS };
        PMD.main(args);
    }
}

可以得到测试结果。


二、编写自己的规则

1. 编写规则类,继承AbstractOptimizationRule,比如:

/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2012 All Rights Reserved.
 */
package com.alipay.codecheck.pmd.rule;


import net.sourceforge.pmd.Rule;


import net.sourceforge.pmd.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.rules.optimization.AbstractOptimizationRule;


/**
 * 
 * @author sunjian
 * @version $Id: SunjianRule.java, v 0.1 2012-2-15 下午03:05:22 sunjian Exp $
 */
public class SunjianRule extends AbstractOptimizationRule implements Rule {


    /** 
     * @see net.sourceforge.pmd.AbstractJavaRule#visit(net.sourceforge.pmd.ast.ASTPrimaryExpression, java.lang.Object)
     */
    public Object visit(ASTPrimaryExpression node, Object data) {
        System.out.println("node=" + node + ",date=" + data);
        return super.visit(node, data);
    }
}


2.在src/main/resources/rulesets中进行修改:

a) 增加myrule.xml,内容类似下面:


    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"
    xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
 
  This ruleset checks my code for bad stuff
 

class="com.alipay.codecheck.pmd.rule.SunjianRule">

              sunjian first rule
       

3



                   contact [email protected]
        ]]>
       


关键在于rule标签的内容,这里可以自己定制。

b) 在rulesets.properties中增加对myrule.xml的引用


3. 重新运行PMDRunner,可看到效果。

你可能感兴趣的:(技术工具)