2017-08-25 173 views
3

使用Java插件4.9.0.9858運行SonarQube 6.4我寫了一條規則來確認內部開發的maven項目正在導入包含各種庫的標準版本號的父POM文件。我編碼,單元測試,部署併成功激活了質量配置文件中的規則。但是,當我使用該質量配置文件對Maven項目運行掃描時,該規則未被解僱。SonarQube無法識別自定義PomCheck規則

我可以看到類org.sonar.java.xml.XmlAnalyzer決定爲一般的xml文件和特別是pom文件觸發哪些規則。具體來說,XMLAnalyzer選擇所有作爲org.sonar.java.xml.maven.PomChecks實例的規則應用於pom.xml文件。

問題是,我的自定義規則org.sonar.java.xml.maven.PomCheck的一個實例,如下

import org.sonar.java.xml.maven.PomCheck; 

...snip... 

@Rule(key = "UseParentPOM") 

public class UseParentPOM implements PomCheck { 

...snip... 

這「實現了PomCheck」方法的Java插件提供的究竟是如何像GroupIdNamingConventionCheck規則自己定義爲PomChecks - 並且他們在我的掃描運行期間被選中。我已經檢查過我正在使用SQ安裝使用的插件庫版本編譯我的自定義規則。運行sonar-scanner-debug並附加到正在運行的進程中,顯示​​我的UseParentPOM規則實際上在XMLAnalyzer用於搜索候選規則的訪問者列表中。但「PomCheck訪客實例」的具體情況返回false。 Ergo,我的規則不會添加到pom規則列表中,並且在掃描pom.xml時不會被觸發。

顯然,我的規則類不是XMLAnalyzer期望的PomCheck,但是我做錯了什麼使它成爲PomCheck的一個實例?

UPDATE

一些進一步挖掘表明.jar文件提供類,java的前端-4.9.0.9858.jar,在兩個基聲納-java的插件-4.9.0.9858.jar和我的custom-java-rules-1.0-SNAPSHOT.jar。我的調試運行表明SonarQube似乎爲擴展目錄中的每個插件.jar啓動了單獨的類加載器。因此,就SQ而言,的確有2個'org.sonar.java.xml.maven.PomCheck'類。因此我的原始問題。

爲此,我試圖通過將所有聲納相關依賴關係作爲<提供的>從我的自定義規則.jar中刪除java-frontend-4.9.0.9858.jar(以及PomCheck類)。我希望得到的SQ過程將有1個PomCheck課程來統治他們。然而,實際結果是,SQ甚至沒有啓動,由於無法找到(TA DA)類PomCheck,在嘗試加載我的自定義規則類時Web服務器進程失敗。

我似乎已經達到了一個不可解決的困境 - 如果我在自定義.jar中包含PomCheck,SQ開始很好,但不會將我的自定義規則識別爲「真實」PomCheck。如果我在自定義.jar中不包含PomCheck,則SQ將不會啓動。所以現在我真的陷入了困境 - 請幫助。

額外的細節

回覆:尼古拉斯·B的請求,註冊我的自定義規則的代碼如下

public final class MyRulesList { 

...snip... 

public static List<Class<? extends JavaCheck>> getChecks() { 
    return ImmutableList.<Class<? extends JavaCheck>>builder().addAll(getJavaChecks()).addAll(getJavaTestChecks()).build(); 
} 
public static List<Class<? extends JavaCheck>> getJavaChecks() { 
    return ImmutableList.<Class<? extends JavaCheck>>builder() 
     .add(PackageNaming.class) 
     .add(LoggingLevels.class) 
     .add(UseParentPOM.class) 
     .build(); 
} 
... snip ... 

}

此代碼是直接從編寫自定義的Java規則複製101網站。就我所見,所有3個自定義類都已正確註冊 - 我可以在Web控制檯UI中看到它們,並將它們添加到質量門。規則PackageNaming/LoggingLevels和規則UseParentPOM之間的唯一區別是UseParentPOM實現了PomCheck接口,而不是JavaCheck。然而,由於PomCheck類不過是類JavaCheck的封裝,所以這似乎是註冊UseParentPom類的正確方法,例如,就像其他JavaCheck一樣。但也許不是?

+0

你可以用更多的細節/代碼來更新你的問題:關於你的規則是如何被註冊和激活的(https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101#WritingCustomJavaRules101-將客戶註冊到自己的插件)? –

回答

1

簡而言之:SonarJava不支持對POM文件進行自定義檢查(即自定義PomCheck)。

更多細節

Java custom rules tutorial,自定義規則必須由他們餵養getJavaChecks被激活(對源文件選中)或getJavaTestChecks(對測試文件選中)。事情是,pom.xml文件不屬於這兩個類別中的任何一個,它們屬於'XML文件存儲桶',對其檢查特定規則。

一個可視化的好方法是查看SonarJava的CheckList.java,注意專用的getXmlChecksgetMavenChecks。這些是實際針對掃描器索引的XML文件運行的檢查。

具體來說

雖然您可以自由定製的規則添加到getJavaChecksgetJavaTestChecks,SonarJava API不支持將規則添加到getMavenChecks(你可以嘗試,但它會有效地什麼都不做)。您的總體分析是相當現場的,但事實是,只有包含api的包可通過類加載器(example)訪問,而不是PomCheck的情況

我不知道這方面有任何改變的計劃。

'外箱思維' 的建議

SonarXML支持使用XPath表達式(見extension guide)自定義規則。有了一些XPath體操,你可以考慮擴展規則xml:XPathCheck - 跟蹤違反XPath規則

+0

公平的恩,我已經走下了XPathCheck路線尋找其他更簡單的規則。不過,我會在這裏請求SQ團隊考慮在Java插件中添加對定製PomChecks的支持。在我看來,如果基本的java插件本身支持做PomCheck,那麼也應該可以添加一個自定義的PomCheck。 – SCornell