锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 浜嗚ВXPath錛?/span>http://www.w3.org/TR/xpath
2. 瀵?/span>PMD 鐨勫疄鐜板師鐞嗘湁涓瀹氱殑浜嗚В
綆鍗曚粙緇嶄竴涓?/span>pmd鐨勫疄鐜板師鐞嗭細
Pmd鍒╃敤javacc鍜?/span>EBNF鏂囨硶浜х敓涓涓垎鏋愬櫒錛岀敤鏉ュ垎鏋?/span>java婧愪唬鐮侊紙鏂囨湰錛夈傚張鍦?/span>JavaCC鐨勫熀紜涓婂姞鍏ヤ簡璇箟鐨勬蹇典篃灝辨槸JJTree錛岃繖鏍峰氨鎶?/span>java source杞崲鎴愪簡涓涓娊璞¤娉曟爲錛?/span>AST錛夛紝AST鏄竴涓粨鏋勫寲鐨勫璞″眰嬈$粨鏋勩傛垜浠彲浠ョ敤璁塊棶鑰呮ā寮忚闂繖涓粨鏋勪笂鐨勬瘡涓妭鐐廣備粠鑰屾壘鍑哄摢涓妭鐐硅繚鍙嶄簡鍝簺瑙勫垯銆?/span>
瀹炵幇榪囩▼錛?/span>
l 棣栧厛浼犱竴涓枃浠跺悕鎴栬?/span>Ruleset緇?/span>pmd
l Pmd鎶婅鏂囦歡嫻佷紶緇欒嚜宸辯敓鎴愮殑javaCC鍒嗘瀽鍣?/span>
l 鍒嗘瀽瀹屾瘯鍚庯紝pmd鑾峰緱浜嗗垎鏋愮敓鎴愮殑AST鐨勪竴涓紩鐢?/span>
l PMD鎶?/span>AST澶勭悊鎴愪竴涓鍙瘋〃錛屼綘鍙互鍦ㄧ鍙瘋〃閲岄潰鏌ヨ涓浜涙湁鐢ㄧ殑淇℃伅
l 姣忎釜pmd瑙勫垯閮戒細閬嶅巻鏁翠釜AST騫舵楠屾槸鍚﹀彂鐢熶簡閿欒
l 鎺ョ潃pmd浜х敓涓涓姤琛紝涓婇潰璇存槑浜嗘湁鍝簺鍦版柟榪濆弽浜?/span>pmd瑙勫垯
緙栧啓pmd瑙勫垯鏈変袱縐嶆柟娉曪細
鐢?/span>java code錛岄渶瑕佷簡瑙?/span>pmd鐨?/span>api錛岄渶瑕佽繘琛屾繁鍏ョ爺絀訛紝涔熷父甯哥敤浜庝竴浜涙瘮杈冨鏉傜殑pmd瑙勫垯
鐢?/span>xpath錛屽鐫浜х敓鐨?/span>AST鏍戯紝鍐欏氨琛屼簡錛屼笂鎵嬫瘮杈冨揩錛屽啓璧鋒潵涔熸瘮杈冪畝鍗?/span>
涓嬮潰涓句竴涓敤XPath瀹炵幇鐨勪竴涓?/span>PMD瑙勫垯錛?/span>
鍦ㄩ」鐩腑錛屾垜浠笉甯屾湜Application鐨勫紑鍙戜漢鍛樻墜鍔ㄧ殑璋冪敤Toplink UnitOfWork鐨?/span>commit,
commitAndResume, commitAndResumeOnFailure'鏂規硶錛屽洜涓烘瘡嬈℃彁浜ら兘浼氭槧鍍?/span>performa錛屾垜浠殑鎻愪氦鏄斁鍦ㄨ嚜宸辯紪鍐欑殑framework閲岄潰錛屽湪鎸囧畾鐨勪綅緗彁浜ゃ傛墍浠ユ垜浠妸瑙勫垯鐨勪紭鍏堢駭璁劇疆涓?/span>3. 鍦?/span>eclipse鐨?/span>pmd plugin涓紝浼樺厛綰т負3浼氫駭鐢熶竴涓鍛娿?/span>
1棣栧厛灝?/span>D:"local_lib"pmd-bin-4.2"bin 鍔犲埌緋葷粺鐜鍙橀噺鐨?/span>path涓?/span>
2鎵撳紑cmd 榪愯 designer 鍒嗘瀽鍣?/span>
3宸︿笂瑙?/span>source code鍙互鎶婁綘鍐欏ソ鐨?/span>java source copy榪囨潵涓昏灝卞湪榪欎釜java source code鍩虹涓婁笉鏂慨姝d綘鐨?/span>pmd瑙勫垯銆?/span>
4xpath query錛氱敤鏉ョ紪鍐欒嚜瀹氫箟鐨?/span>xpath expression錛堝厛涓嶅繖鍐?/span>xpath expression錛?/span>
5鐐瑰嚮go錛屽氨浼氬湪宸︿笅瑙掔殑Abstract syntax Tree涓駭鐢?/span>AST錛屼綘鍙互閫夋嫨AST涓婄殑鏌愪釜鑺傜偣錛屽乏涓嬭鐨勪笅闈竴涓涓氨浼氬嚭鐜拌鑺傜偣鐨勪竴浜涗俊鎭傛槸鍦ㄧ鍙瘋〃涓煡璇㈠緱鍒扮殑銆?/span>
6錛?/span>DFA鏄?/span>pmd4鐨勬柊鍔熻兘錛岀敤浜庣紪鍐欐洿澶嶆潅鐨?/span>pmd瑙勫垯錛屼笉鍏夋槸鏌愪釜source code綰у埆浜嗭紝pmd4浣跨敤浜?/span>asm璇誨彇瀛楄妭鐮侊紝騫朵綔鍒嗘瀽錛屽鐞嗙被鏂囦歡涔嬮棿鐨勪緷璧栨с傚湪瀹為檯浣跨敤涓紝鐗瑰埆鏄湪鐗瑰畾搴旂敤涓紝榪欎釜鍔熻兘鏄浉褰撴湁鐢ㄧ殑銆傝繕鍙互鐢ㄦ潵綆鍖栦竴浜涚幇鏈夌殑瑙勫垯銆?/span>
7鏍規嵁鐢熸垚鐨?/span>AST緙栧啓xpath expression銆傚浜庝笂鏂囨彁鍒扮殑source媯鏌ヨ鍒欑紪鍐欎簡涓涓?/span>xpath
Expression錛屽湪緙栧啓xpath expression鐨勮繃紼嬩腑闇瑕佸弽澶嶇殑淇敼婧愪唬鐮佸茍涓斿弽澶嶇殑淇敼xpath expression榪欐牱鎵嶈兘婊¤凍鎵鏈夌殑闇瑕侊紝鍙嶅鐨勭偣鍑?/span>go銆?/span>
鏈鍚庡啓濂界殑瑙勫垯澶ц嚧濡備笅錛?/span>
//PrimaryExpression[
(PrimaryPrefix/Name[ends-with(@Image, 'commit') or ends-with(@Image, 'commitAndResume') or ends-with(@Image, 'commitAndResumeOnFailure')] and substring-before(PrimaryPrefix/Name/@Image, '.') = //VariableDeclaratorId[../..//ClassOrInterfaceType[@Image =
'UnitOfWork']]/@Image) or (PrimarySuffix[ends-with(@Image, 'commit') or ends-with(@Image, 'commitAndResume') or ends-with(@Image, 'commitAndResumeOnFailure')] and (PrimarySuffix[ends-with(@Image, 'getActiveUnitOfWork')] or PrimarySuffix[ends-with(@Image, 'acquireUnitOfWork')]))
and
//ImportDeclaration/Name[
contains(@Image,'oracle.toplink.sessions.UnitOfWork') or contains(@Image, 'oracle.toplink.sessions')]
]
8錛庡皢鍐欏ソ鐨?/span>xpath expression杞崲鎴?/span>pmd rule銆?/span>Designer鍙互鑷姩鐢熸垚鐐瑰嚮鑿滃崟actions涓嬮潰鐨?/span>create rule xml銆?/span>
9錛庢渶鍚庡皢鐢熸垚鐨?/span>rule娣誨姞鍒?/span>ruleset涓紝騫舵渶濂藉湪澶ф壒閲忕殑浠g爜涓繘琛岄獙璇併?/span>