使用您自己的规则在Eclipse中自定义PMD
在繼續(xù)閱讀之前,您應(yīng)該檢查我以前的文章之一-JPA-@Enumerated default attribute 。 當(dāng)您與一群JPA項(xiàng)目人員一起工作時(shí),幾乎可以確定,其中一個(gè)開發(fā)人員將使用@Enumerated批注而不定義EnumType ,并且如果您不在數(shù)據(jù)庫級(jí)別使用嚴(yán)格的數(shù)據(jù)驗(yàn)證(例如列級(jí)別的約束) ),您將陷入深深的麻煩。
我們想要實(shí)現(xiàn)的是在不使用EnumType的情況下使用@Enumerated報(bào)告一個(gè)錯(cuò)誤:
@Entity @Table(name = 'BENEFITS') public class Benefit implements Serializable {...@Column(name = 'BENEFIT_TYPE')@Enumeratedpublic BenefitType getType() {return type;}... }如果使用@Enumerated和ORDINAL EnumType則發(fā)出警告:
@Entity @Table(name = 'BENEFITS') public class Benefit implements Serializable {...@Column(name = 'BENEFIT_TYPE')@Enumerated(EnumType.ORDINAL)public BenefitType getType() {return type;}... }我們可以通過兩種方式實(shí)現(xiàn)我們的目標(biāo),要么用Java描述PMD規(guī)則,要么使用XPath –我將在本文中重點(diǎn)介紹第二種方式。
讓我們從頭開始;)–我們必須首先下載PMD (我使用版本4.2.5, pmd-bin-4.2.5.zip ),將其解壓縮到某個(gè)位置,將工作目錄更改為解壓縮的PMD目錄,然后運(yùn)行規(guī)則設(shè)計(jì)器(可以在./bin/designer.sh中找到)。 您應(yīng)該會(huì)看到以下內(nèi)容:
讓我們將要分析的代碼放入源代碼面板,然后單擊“執(zhí)行”按鈕:
在“抽象語法樹”面板的中間,您可能會(huì)看到:注釋/ MarkerAnnotation /與未定義EnumType的 @Enumerated注釋相對(duì)應(yīng)的Name結(jié)構(gòu)。 為了匹配它,我們將在XPath表達(dá)式之后放入XPath Query面板:
//MarkerAnnotation/Name[@Image = 'Enumerated']現(xiàn)在點(diǎn)擊“開始”按鈕時(shí):
您將在右下角的面板中找到找到的匹配項(xiàng):) – XPath查詢正確:)。
現(xiàn)在,當(dāng)我們有了XPath查詢時(shí),我們必須使用它來定義規(guī)則,讓我們打開新的XML文件,將其命名為jpa-ruleset.xml ,并放入其中:
<ruleset name='JPA ruleset'xmlns='http://pmd.sf.net/ruleset/1.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd'xsi:noNamespaceSchemaLocation='http://pmd.sf.net/ruleset_xml_schema.xsd'><description>JPA ruleset</description><rule name='AvoidDefaultEnumeratedValue' message='By default @Enumerated will use the ordinal.' class='net.sourceforge.pmd.rules.XPathRule'><priority>2</priority><properties><property name='xpath' value='//MarkerAnnotation/Name[@Image = 'Enumerated']' /></properties></rule> </ruleset>如您所見,我們使用net.sourceforge.pmd.rules.XPathRule作為規(guī)則類,并為包含我們的XPath查詢的該規(guī)則定義xpath屬性。 上例中的優(yōu)先級(jí)表示:1 –錯(cuò)誤,高優(yōu)先級(jí),2 –錯(cuò)誤,正常優(yōu)先級(jí),3 –警告,高優(yōu)先級(jí),4 –警告,正常優(yōu)先級(jí)和5 –信息。
我們將向我們的JPA規(guī)則集中添加另一個(gè)規(guī)則,當(dāng)@Enumerated與顯式ORDINAL EnumType一起使用時(shí),它負(fù)責(zé)報(bào)告警告-它可以是@Enumerated(EnumType.ORDINAL)或@Enumerated(value = EnumType.ORDINAL) ,因此我們需要現(xiàn)在是兩個(gè)XPath表達(dá)式的替代方案:
<rule name='EnumeratedAsOrdinal' message='Enumeration constants shouldn''t be persisted using ordinal.' class='net.sourceforge.pmd.rules.XPathRule'><priority>4</priority><properties><property name='xpath' value='//SingleMemberAnnotation/Name[@Image = 'Enumerated']/following-sibling::MemberValue//Name[@Image = 'EnumType.ORDINAL'] |//NormalAnnotation/Name[@Image = 'Enumerated']/following-sibling::MemberValuePairs/MemberValuePair[@Image = 'value']//Name[@Image = 'EnumType.ORDINAL']' /></properties></rule>現(xiàn)在,當(dāng)我們擁有包含這兩個(gè)規(guī)則的規(guī)則集時(shí),將其導(dǎo)入到Eclipse IDE中。 此時(shí),我假設(shè)您已經(jīng)安裝了Eclipse的PMD插件(請(qǐng)參閱: PMD –與IDE的集成 )。
打開Eclipse Preferences,找到PMD部分并展開它,您應(yīng)該看到:
點(diǎn)擊“導(dǎo)入規(guī)則集...”
選擇包含規(guī)則集的文件,選擇是否要通過引用或復(fù)制導(dǎo)入(在這種情況下,您的規(guī)則集名稱將被忽略,并且將使用' pmd-eclipse '名稱),并且您應(yīng)該看到將兩個(gè)規(guī)則添加到了清單:
在eclipse詢問時(shí)執(zhí)行必要的構(gòu)建,然后在開始使用我們的新規(guī)則之前,請(qǐng)檢查項(xiàng)目屬性:
應(yīng)該啟用“啟用PMD”選項(xiàng),以便PMD即時(shí)檢查您的代碼,我們新添加的規(guī)則應(yīng)在該項(xiàng)目中處于活動(dòng)狀態(tài)(默認(rèn)情況下為默認(rèn)狀態(tài))。
讓我們現(xiàn)在寫一些“壞代碼”,匹配我們定義的第一條規(guī)則:
當(dāng)您用鼠標(biāo)將紅色標(biāo)記指向左側(cè)時(shí),您將看到規(guī)則消息,如XML中所定義:
第二條規(guī)則匹配:
和消息,如XML所定義:
甜點(diǎn)的幾個(gè)鏈接:
- 如何編寫PMD規(guī)則
- XPath規(guī)則教程
- 如何制定新的規(guī)則集
參考: 使用我們自己的JCG合作伙伴 Micha 的規(guī)則在Eclipse中自定義PMD ? 術(shù)士思想博客上的Ja?tak。
翻譯自: https://www.javacodegeeks.com/2012/10/customize-pmd-in-eclipse-with-your-own.html
總結(jié)
以上是生活随笔為你收集整理的使用您自己的规则在Eclipse中自定义PMD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何打开电脑中的菜单(怎么打开电脑的菜单
- 下一篇: 重写到边缘–充分利用它! 在GlassF