使用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一樣。但也許不是?
你可以用更多的細節/代碼來更新你的問題:關於你的規則是如何被註冊和激活的(https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101#WritingCustomJavaRules101-將客戶註冊到自己的插件)? –