PMD使用與程式碼質量

chenda2001發表於2009-04-23

最近專案組要求使用PMD工具,透過自定義規則來檢查程式碼,接錄部分文件內容如下:

PMD介紹

PMD是一種開源分析Java程式碼錯誤的工具。與其他分析工具不同的是,PMD透過靜態分析獲知程式碼錯誤。也就是說,在不執行Java程式的情況下報告錯誤。PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程式的許多問題,例如:

® 潛在的bug:空的try/catch/finally/switch語句

® 未使用的程式碼:未使用的區域性變數、引數、私有方法等

® 可選的程式碼:String/StringBuffer的濫用

® 複雜的表示式:不必須的if語句、可以使用while迴圈完成的for迴圈

® 重複的程式碼:複製/貼上程式碼意味著複製/貼上bugs

® 迴圈體建立新物件:儘量不要再forwhile迴圈體內例項化一個新物件

@ 資源關閉:ConnectResultStatement等使用之後確保關閉掉

此外,使用者還可以自己定義規則,檢查Java程式碼是否符合某些特定的編碼規範。例如,你可以編寫一個規則,要求PMD找出所有建立ThreadSocket物件的操作。

安裝並從命令列執行PMD

你可以從PMD的網站下載PMD的二進位制版本,或下載帶原始碼的版本,下載得到的都是ZIP檔案。假設你下載了二進位制版本,先把它解壓縮到任意一個目錄。接下來怎麼做,就要看你準備怎麼用它——最簡單的,如果要在一個Java原始碼目錄中執行PMD,只需直接在命令列上執行下面的命令:

E:SoftWarepmd-bin-4.2.1pmd-4.2.1bin>java -jar ..libpmd-4.2.1.jar D:ebsser

viceebsservicesrc text rulesets/unusedcode.xml

輸出結果類如:

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyInput.java:

51 Avoid unused private fields such as 'logger'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMPolicyShow.java:2

5 Avoid unused private fields such as 'logger'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPoli

cyNo.java:32 Avoid unused local variables such as 'visaStatus'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsSMQueryPolicyByPoli

cyNo.java:44 Avoid unused local variables such as 'temp'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebseriskESMPolicyInpu

t.java:28 Avoid unused private fields such as 'logger'.

D:ebsserviceebsservicesrccomsinosoftservicepolicyebsjriskJSMPolicyInpu

t.java:22 Avoid unused private fields such as 'logger'.

一些可以載入必須引數前面或者後面的可選引數如下:

-debug: 列印debug日誌資訊

-targetjdk: 指定目標原始碼的版本- 1.3, 1.4, 1.5, 1.6 or 1.7;

預設是1.5

-cpus: 指定建立的執行緒數

-encoding: 指定PMD檢查的程式碼的編碼方式

-excludemarker: 指定PMD需要忽略的行的標記,預設為NOPMD

-shortnames: 在報告中顯示縮短的檔名

-linkprefix: HTML原始檔的路徑,只是為了HTML顯示

-lineprefix: 自定義的錨,用於影響原始檔中的行,只是用於HTML顯示

-minimumpriority: 規則的優先順序限制,低於優先順序的規則將不被使用

-nojava: 不檢查java檔案,預設是檢查java檔案

-jsp: 檢查JSP/JSF檔案,預設不檢查

-reportfile: 將報告輸出到檔案,預設是列印在控制檯

-benchmark: 輸出一個基準清單,預設輸出到控制檯

-xslt: 覆蓋預設的xslt

-auxclasspath: 指定原始碼檔案使用的類路徑

例如在windows系統中,例子如下:

c:> java -jar pmd-4.2.1.jar c:mysourcecode text unusedcode,imports -targetjd

k 1.5 -debug

c:> java -jar pmd-4.2.1.jar c:mysourcecode xml basic,design -encoding UTF-8

c:> java -jar pmd-4.2.1.jar c:mysourcecode html typeresolution -auxclasspath

commons-collections.jar;derby.jar

EclipsePMD外掛執行方式

PMD可以作為外掛整合到很多IDE中,很多的外掛中都包含了PMDjar檔案,這個jar檔案中包含了規則集。所以雖然一些外掛中使用rulesets/unusedcode.xml來作為引數引用規則集,但是實際上是使用getResourceAsStream()方法來從PMDjar檔案中載入。

由於Eclipse是比較流行的開源Java/J2EE開發IDE,所以本文主要介紹如何在Eclipse中使用PMD工具進行程式碼的檢查

安裝基於 IDE的外掛

安裝EclipsePMD外掛的過程如下:

® 啟動Eclipse

® 選擇Help--&gtSoftware Updates--&gtFind and Install

® 選擇Next,選擇New remote site

® Name框中輸入PMDURL框中輸入

® 在之後的對話方塊中一直點選下一步或者接受協議,完成EclipsePMD外掛的安裝

也可以透過下載zip檔案按,然後執行上述過程,只是使用New locale site來代替New remote site,並使用下載的zip檔案。

可以透過Windows--&gtPreferences來配置PMD

透過右鍵一個,然後選擇PMD--&gtCheck node with PMD,即可使用PMD工具檢查程式碼。如果要進行重複程式碼檢測,那麼右鍵一個專案後,選擇PMD--&gtFind suspect cut and paste。檢查結果會放在reports目錄下,檔名為cpd-report.txt

可以透過使用Eclipse的幫助系統來檢視PMD外掛的文件。

在安裝完更新後,如果發生了一個異常,例如”java.lang.RuntimeException: Could not find that class xxxx”,這時試著刪除workspace中的.metadata/plugins/net.sourceforge.pmd.eclipse目錄下的ruleset.xml檔案。

使用PMD

1、啟動Eclipse IDE,開啟工程,選擇 "Windows"->"Preferences"下的PMD項,其中Rules Configuration 專案可以配置PMD的檢查規則,自定義檢查規則也可以在此透過Import的方式匯入到PMD

2、配置好後,滑鼠右鍵點選工程中需要檢查的JavaSource,選擇"PMD"->"Check Code With PMD" ,之後PMD就會透過規則檢查你的JavaSource了並且將資訊顯示在PMD自己的檢視上

3、示例

import java.util.*;

public class Test {

public static void main(String[] args) {

try{

if(true) {}

System.out.println("Hello World!");

} catch(Exception e) {

}

}

}

以上程式碼PMD會檢查出:catch塊中沒有內容、if判斷塊中沒有內容、程式碼中出現System.out.println等警告描述

[@more@]DM

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21327621/viewspace-1021158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章