參考文獻:
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/