參考文獻:
http://www.oschina.net/p/pmd/
http://www.cnblogs.com/flyme/archive/2011/09/09/2172548.html
http://blog.csdn.net/ml5271169588/article/details/6975690
目 錄
1 PMD介紹
2 在ECLIPSE中安裝和使用PMD步驟
2.1 Elipse中安裝PMD插件
3 在ECLIPSE中使用PMD操作步驟
3.1 激活PMD插件
3.2 打開PMD視圖
3.3 執行PMD任務
3.4 Violations Overview淺析
3.5 Violations Outline淺析
4 關於PMD規則
4.1 選擇合適的規則
4.2 自帶規則的介紹
4.3 自定義規則
4.4 自定義規則集合
4.5 其它事項
5 使用ANT進行調用
6 總結
1 PMD介紹
PMD是一款采用BSD協議發布的Java程序代碼檢查工具。該工具可以做到檢查Java代碼中是否含有未使用的變量、是否含有空的抓取塊、是否含有不必要的對象等。該軟件功能強大,掃描效率高,是Java程序員debug的好幫手。
與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說在不運行Java程序的情況下,報告錯誤。
PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程序的許多問題。
此外,用戶還可以自己定義規則。檢查Java代碼是否符合某些特定的編碼規范。常見的類型如下:
- 可能的bug(Possible bugs):空try/catch/finally/switch語句
- 無效代碼(Dead code):未使用的變量,參數和私有方法
- 非最佳的代碼(Suboptimal code):較耗費資源的String/StringBuffer用法
- 過於復雜的表達式(Overcomplicated expressions):不必要的if語句,或應該為while的for循環
- 重復代碼(Duplicate code):復制/粘貼代碼意味着復制/粘貼bug
2 在Eclipse中安裝和使用PMD步驟
2.1 Elipse中安裝PMD插件
以下為我的安裝步驟,可能大家用的是MyEclipse步驟不僅相同。
打開Help->Install new Software,點擊Add,添加Repository。Name:PMD,Location:http://pmd.sf.net/eclipse。點擊OK。選擇相應的版本插件,繼續隨后的安裝。
Step 1:
Step 2:
Step 3:
3 在Eclipse中使用PMD操作步驟
3.1 激活PMD插件
Ecplise的菜單Project->Properties->PMD,在這個窗口選擇要應用的規則,並指定相對重要性,為特定項目詳細配置PMD,目前只需要選中Enable PMD復選框,保留默認規則集。
3.2 打開PMD視圖
3.3 執行PMD任務
單擊項目資源,右鍵->PMD->Check code with PMD。在Violation OverView視圖中按問題嚴重程度列出PMD問題。
在ViolationsoutLinew右鍵show Details可以查看更詳細的規則描述以及說明規則的示例代碼。
3.4 Violations Overview淺析
- Element:檢查的文件;
- Violation/LOC(lineofcode縮寫)為:警告個數/源代碼行數x1000;
- Violations/Method:警告個數除以方法個數(類中每個方法中的平均錯誤);
- Project:所在項目
右鍵點擊框體的任意位置顯示4個選項按鈕對應的功能為
- Filter Resource:是否展示下列工程
- Filter Priorities:想要展示的警告等級(5個等級,紅色為最嚴重的警告)
- Presentation Type:展示的結構
- clear PMD violations:清除Violations Outline內的信息
具體處理問題,還是利用Violations Outline比較方便。
查看詳細(Show Details):顯示錯誤的詳細信息 顯示錯誤的詳細信息,如右圖所示:
忽略問題(Mark as reviewed):可能決定可以安全的忽略問題,在這種情況下,使用Mark as reviewed(標記為已審查)菜單項,這將向代碼添加一個注釋,以指示PMD在這里忽略此問題。![]()
手工糾正(Remove violation):可以手工糾正問題,並使用Remove violation(刪除違例)菜單直接從列表中刪除問題。
智能修改:PMD非常智能,在某些情況下,它可以為其提出的問題提供糾正建議,如果是這種情況,可以使用Quick fix(快速修復)菜單類自動糾正。
展開列表,雙擊列表中具體的問題就可以定位的具體的代碼行。
4 關於PMD規則
4.1 選擇合適的規則
運行所有的規則集中的規則會產生非常多的沖突,這些沖突中的很多是不重要的。在這么多的沖突中尋找你關心的部分結果就沒有什么效率可言了。
所以需要從明顯的規則集,也就是說必須要改的地方開始是比較好的一個選擇,例如只是運行unusedcode檢查,然后修改沒有使用的局部變量和成員變量。然后運行基本的檢查,修改所有的空語句,例如if語句等。最后可以執行與設計相關的或者存在一定爭議的規則集,或者自定義的規則集。
4.2 自帶規則的介紹
PMD自帶規則極多,我頓時石化了。還好網上有相應的資料下載。
(PMD插件分析代碼規則(中文).xls) http://download.csdn.net/detail/xiaonn2007/504948
4.3 自定義規則![]()
有兩個辦法來自定義規則,可以編寫java類和編寫XPath。
編寫java類的一般步驟是:
- 先確定要查找的代碼形式,利用PMD 自帶的designer.bat工具查看AST(抽象語法樹);
- 然后編寫規則類(繼承 net.sourceforge.pmd.AbstractRule);
- 然后編寫一個ruleset的XML文件;
- 最后就可以運行PMD進行檢查。
- //ClassBody [count(//VariableDeclarator[../Type/Name[@Image='Logger']])>1] ,這個表達式就是查找類的代碼里是否聲明了多個 Logger ;
- 然后編寫一個 ruleset 的 XML 文件;
- 最后運行 PMD 進行檢查。
PMD 自帶了很多代碼規范的規則,還可以自定義規則,我們可以把這些規則整合到一起,按照我們的需求進行代碼檢查。
<!--
使用整個strings規則集
-->
<
rule
ref
="rulesets/strings.xml"
/>
<!--
使用某個規則集里的某個規則
-->
<
rule
ref
="rulesets/unusedcode.xml/UnusedLocalVariable"
/>
<!--
指定某個規則集里的某個規則的優先級
-->
<
rule
ref
="rulesets/basic.xml/EmptyCatchBlock"
message
="Must handle exceptions"
>
<
priority
>2
</
priority
>
</
rule
>
<!--
去除某個規則集里的某個規則
-->
<
rule
ref
="rulesets/braces.xml"
>
<
exclude
name
="WhileLoopsMustUseBracesRule"
/>
</
rule
>
PMD 里面還有一個寫好的ruleset文件,在pmd-3.8.jar里面的rulesets文件夾下,名稱是favorites.xml,以下是主要部分:
<
rule
ref
="rulesets/basic.xml"
/>
<
rule
ref
="rulesets/basic.xml/EmptyCatchBlock"
message
="Must handle exceptions"
>
<
priority
> 2
</
priority
>
</
rule
>
<
rule
ref
="rulesets/unusedcode.xml"
/>
<
rule
ref
="rulesets/braces.xml/WhileLoopsMustUseBraces"
/>
<
rule
ref
="rulesets/braces.xml/ForLoopsMustUseBraces"
/>
<
rule
ref
="rulesets/design.xml/SimplifyBooleanReturns"
/>
<
rule
ref
="rulesets/design.xml/SwitchStmtsShouldHaveDefault"
/>
<
rule
ref
="rulesets/strings.xml/StringToString"
/>
<
rule
ref
="rulesets/strings.xml/StringInstantiation"
/>
<
rule
ref
="rulesets/controversial.xml/UnnecessaryConstructor"
/>
<
rule
ref
="rulesets/controversial.xml/NullAssignment"
/>
<
rule
ref
="rulesets/controversial.xml/UnusedModifier"
/>
<
rule
ref
="rulesets/codesize.xml/CyclomaticComplexity"
>
<
properties
><
property
name
="reportLevel"
value
="5"
/></
properties
>
</
rule
>
4.5 其它事項:
- 可以使用JDK1.5的聲明 @SuppressWarnings(""),禁止PMD的警告。
- 可以使用//NOPMD來標記行或塊代碼,禁止PMD警告。
- 有兩種方法自定義Rule,編寫java類和編寫XPath。
5 使用Ant進行調用
有了 Ant 這樣的自動化機制,就可以以多種方法監視軟件質量。有許多種掃描源代碼和二進制文件的工具,但是其中最流行的兩種是PMD和FindBugs。
FindBugs掃描二進制文件,並根據一系列規則檢查其中的代碼。如果編譯好的代碼有問題,它就會報告一個違規。
PMD的作用與FindBugs相似,是它掃描源文件並報告 bug。
以下為配置腳本:
<
path
id
="pmd.path"
>
<
fileset
dir
="${lib.dir}/pmd-3.8"
>
<
include
name
="**/*.jar"
/>
</
fileset
>
</
path
>
<
taskdef
name
="pmd"
classname
="net.sourceforge.pmd.ant.PMDTask"
classpathref
="pmd.path"
/>
<
taskdef
name
="cpd"
classname
="net.sourceforge.pmd.cpd.CPDTask"
classpathref
="pmd.path"
/>
<
target
name
="pmd"
>
<
pmd
shortFilenames
="true"
>
<
ruleset
>rulesets/favorites.xml
</
ruleset
>
<
formatter
type
="html"
toFile
="d:\foo.html"
toConsole
="false"
/>
<
fileset
dir
="${src.dir}"
>
<
include
name
="**/*.java"
/>
</
fileset
>
</
pmd
>
</
target
>
<
target
name
="cpd"
>
<
cpd
minimumTokenCount
="100"
outputFile
="d:/cpd.txt"
>
<
fileset
dir
="${src.dir}"
>
<
include
name
="**/*.java"
/>
</
fileset
>
</
cpd
>
</
target
>
6 總結
更多詳情,請查閱官方手冊:
http://www.ibm.com/developerworks/cn/java/j-pmd/
http://pmd.sourceforge.net/
