1版本說明
名稱 | 版本 | 說明 |
---|---|---|
PMD | 5.4.1 | designer.bat |
SONARQUBE | 5.6 | Sonarqube平臺版本 |
pmd-plugin | 2.6 | Pmd插件版本 |
2模板介紹
2.1簡述
注意:創(chuàng)建自定義規(guī)則需要登陸系統(tǒng)
Sonarqube平臺提供了一些模板來快速的實現(xiàn)一些簡單的自定義規(guī)則需求浪谴。JAVA所有的模板如下圖所示(DEPRECATED表示為廢棄的,不建議使用):
點擊某一個模板课锌,就可以進入該模板的說明頁纵朋,在該頁選擇“創(chuàng)建”柿顶,就可以創(chuàng)建自己的規(guī)則了。
下面對各個模板進行簡要說明:
2.2模板Custom resources should be closed
該模版主要實現(xiàn)了自定義資源是否關(guān)閉的檢查操软,防止內(nèi)存泄漏嘁锯。
需要提供的參數(shù):factoryMethod****,****closingMethod****,****constructor****家乘,****openingMethod
2.3模板Track breaches of architectural constraints
該模版主要實現(xiàn)了類之間引用的檢查蝗羊。
需要提供的參數(shù):fromClasses****(可選),****toClasses
例如: toClass設置為java.util.**仁锯,fromClass不設置耀找,那么在任何類中使用如下代碼將會違規(guī)
MapdispatcherConfig; //違規(guī)
PS:該模板后續(xù)將會廢棄,不建議使用业崖。經(jīng)測試野芒,toClass只對JDK類有效
2.4模板Track comments matching a regularexpression
該模板主要實現(xiàn)了注釋內(nèi)容的檢查。
需要提供的參數(shù):regularExpression,message
regularExpression代表正則表達式双炕,message表示輸出的錯誤信息
例如:regularExpression輸入.TODO.狞悲,那么所有包含TODO的注釋將報違規(guī)
2.5模板Track uses of disallowed classes
該模板主要實現(xiàn)了不允許使用的類的檢查。
需要提供的參數(shù):className****妇斤,類名摇锋,也可用正則表達式來實現(xiàn)包的禁止
例如:Classname****:java.lang.String,那么String name則會報違規(guī)
PS:經(jīng)測試站超,該模板只適合JDK的類
2.6模板Track uses of disallowed dependencies
該模板主要實現(xiàn)了不允許使用的依賴的檢查荸恕,主要檢查MAVEN的POM.xml文件。
需要提供的參數(shù):dependencyName****死相,****version
例如:With a parameterof: :.log4j.*
<dependency>
? <groupId>log4j</groupId>
? <artifactId>log4j</artifactId>
? <version>1.2.17</version>
</dependency>//違規(guī)
PS:目前不支持maven的POM.XML的分析融求,分析XML需要XML插件的支持,并且在工程中設置sonar.import_unknown_files"to "true"媳纬。
2.7模板Track uses of disallowed methods
該模板主要實現(xiàn)了不允許使用的方法的檢查双肤。
需要提供的參數(shù):methodName施掏,className****钮惠,****argumentTypes****,****allOverloads
例如:
className:java.lang.String
methodName:replace
argumentTypes:java.lang.CharSequence, java.lang.CharSequence
String name;
name.replace("A","a"); // 違規(guī)
PS:經(jīng)測試七芭,該模板只適合JDK的類
2.8模板XPath rule template
? 該模板是PMD插件提供的一個模板素挽,與之前的模板不一樣,之前的模板為sonar Java插件提供狸驳。因此预明,該模板的使用要依賴于PMD工具。
因為代碼掃描是依賴AST樹形結(jié)構(gòu)的耙箍,所以Xpath模式也就是通過PMD獲取樹的節(jié)點撰糠,再自定義規(guī)則進行匹配。
該模板主要實現(xiàn)了當java文件的AST樹與Xpath定義的規(guī)則匹配時辩昆,就報相應的違規(guī)阅酪。
因為該模板由PMD提供,sonarqube建議使用插件開發(fā)模式,因此該模板標示為: DEPRECATED,但仍然可以使用术辐。
下面詳細介紹Xpath模式的開發(fā)過程砚尽。
2.8.1開發(fā)過程
開始開發(fā)之前可以導入PMD源碼到Eclipse中,在pmd-java項目下找到rulesets文件夾辉词,底下全部是Java對應的PMD規(guī)則必孤,可以用來學習和參考。
以下以teller9的不允許使用GlobalCache來演示實現(xiàn)XPATH的完整過程瑞躺。
1敷搪、規(guī)則分析:
違規(guī)使用平臺內(nèi)部的執(zhí)行緩存
例1:
Map<String,Object>map = (Map<String,Object>)GlobalCache.getInstance().getCacheData();
例2:
GlobalCache.getInstance().setCacheData(map);
推薦的使用方式
無,不允許項目中使用GlobalCache存放數(shù)據(jù)
按照以上規(guī)則說明幢哨,可以看出购啄,當用Xpath rule template來實現(xiàn)這個規(guī)則時,需要能夠匹配到setCacheData方法嘱么,并且map變量名一致狮含。
2、使用PMD工具解析java文件
打開pmd/bin/designer.bat曼振,在Source code中輸入錯誤樣例几迄,點擊Go,AST一欄出現(xiàn)了PMD解析出來的java文件的AST樹冰评,該樹是我們進行后續(xù)開發(fā)的基礎映胁。
3、寫出XPATH規(guī)則
現(xiàn)在就可以寫對應的Xpath查詢了甲雅。Xpath要實現(xiàn)與違規(guī)的情景匹配解孙,與正確的寫法不匹配的基本目標。具體的Xpath方法可以查閱附錄資料抛人。
在Xpath Query輸入對應的查詢弛姜,點擊Go,就可以進行調(diào)試妖枚。當在右下角的框中出現(xiàn)了ASTblock Statement at line xxx 語句廷臼,這就說明PMD表達式成功了,可以從左側(cè)源碼中匹配到了符合觸發(fā)條件的代碼绝页。這時檢查行數(shù)是否在應該觸發(fā)違規(guī)的代碼處荠商。
當違規(guī)的情況驗證后,再輸入正確的source code续誉,再次執(zhí)行查詢莱没,此時右下角框中應該顯示:No matching code xxxx。
4酷鸦、創(chuàng)建自定義規(guī)則
建立成功PMD規(guī)則后饰躲,打開Sonarqube主頁朴译。點擊菜單欄的代碼規(guī)則,選擇Java属铁,選擇模板眠寿,只顯示模板,點擊右側(cè)的XPathrule template焦蘑,列出Xpath模板詳情盯拱。點擊創(chuàng)建,在彈出框中依次輸入名稱例嘱、關(guān)鍵字狡逢、描述,再選擇嚴重級別拼卵、狀態(tài)奢浑,最后在xpath文本框中輸入
//Block/BlockStatement[1]
[
.//PrimaryPrefix/Name[@Image='GlobalCache.getInstance']
and
(
ancestor::Block/BlockStatement[
? Statement/StatementExpression/PrimaryExpression
? [./PrimarySuffix[ends-with(@Image,"setCacheData")]]
?
]
)
]
這個PMD規(guī)則,點擊創(chuàng)建腋腮,保存成功即可雀彼。
? 5、執(zhí)行規(guī)則
在Sonarqube界面的質(zhì)量配置中新建“Java自定義規(guī)則”的質(zhì)量集合并設置為默認配置即寡,再次進入PMD模板頁面徊哑,點擊“不允許使用GlobalCache”進入詳情頁,點擊下面的活動按鈕聪富,將這個規(guī)則放到“Java自定義規(guī)則”下面莺丑。
輸入cmd進入命令行模式,進入需要調(diào)試的工程目錄墩蔓。比如梢莽,C:\work\manage>,輸入sonar-scanner進行代碼掃描奸披。待掃描結(jié)束后昏名,可以在Sonarqube界面查看bug情況。
2.8.2 參考
相關(guān)資料:
http://pmd.sourceforge.net/pmd-5.4.1/customizing/xpathruletutorial.html
http://www.w3school.com.cn/xpath/index.asp
PMD源碼主分支