1. 程式人生 > >1. PMD 使用,編譯和自定義規則

1. PMD 使用,編譯和自定義規則

自定義 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


  1. 下載maven

    地址:maven下載

  2. 配置MAVEN_HOME和path

  3. 檢測maven環境:開始菜單->運行->cmd->mvn -v

如下圖:

技術分享


四 配置JDK

這個網上資料太多了,就不細說了, 比如:

http://www.cnblogs.com/smyhvae/p/3788534.html


五 編譯PMD


  1. 在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規則, 不過也說說自己的操作方法


  1. 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


  1. 在線安裝

    File->Settings->Plugins->pmd->Browse repositories,找到後直接點install,然後重啟AndroidStudio。

    但是這種方法我沒有成功,報錯是打開zip file失敗。


  2. 本地安裝

    把安裝包下載到本地,然後

    File->Settings->Plugin->install plugin from disk->重啟AndroidStudio

    一共需要安裝兩個插件,一個是pmd,還有一個是pmd依賴的pmd core;下載地址如下:

    gradle-android-metric-pmd.jar

    gradle-android-metric-core.jar

  3. 增加配置模塊

    可以新建一個module為config,在config module的quality.gradle裏面配置pmd的task,如下:


  4. apply plugin: ‘pmd‘
  5. 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。


  6. 在app的build.gradle增加對這個模塊gradle的引用

  7. apply from: ‘../config/quality.gradle‘

  8. 執行編譯


可以右擊AndroidStudio的gradle裏面pmd這個task(如果沒有的話,可以build->rebuild project,在右邊Gradle Projects裏面刷新下)

技術分享



或者在項目根目錄,執行gradle pmd





附錄:

下面是pmd的一些相關網址

  1. PMD github源代碼 下載時註意branch

  2. PMD介紹 包括大部分PMD檢查分類的介紹,比如basic是幹什麽

  3. PMD自定義規則的實現

  4. PMD官網

  5. 安裝maven

  6. PMD java doc編譯失敗


謝謝上面的博主。



本文出自 “www.bogo.com” 博客,請務必保留此出處http://483181.blog.51cto.com/473181/1922605

1. PMD 使用,編譯和自定義規則