簡體   English   中英

SonarQube無法識別自定義PomCheck規則

[英]SonarQube doesn't recognize custom PomCheck rule

使用Java插件運行SonarQube 6.4 4.9.0.9858.I編寫了一條規則來確認內部開發的maven項目正在導入包含各種庫的標准版本號的父POM文件。 我已成功編碼,單元測試,部署和激活質量配置文件中的規則。 但是,當我使用該質量配置文件對maven項目運行掃描時,不會觸發該規則。

我可以看到類org.sonar.java.xml.XmlAnalyzer決定為一般的xml文件和特別是pom文件觸發哪些規則。 具體來說,XMLAnalyzer選擇所有作為org.sonar.java.xml.maven.PomChecks實例的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。 因此,我的規則未添加到pom規則列表中,並且在掃描pom.xml時不會觸發。

很明顯,我的規則類不是XMLAnalyzer所期望的PomCheck,但是我把它作為PomCheck的實例做錯了什么?

UPDATE

進一步挖掘顯示提供類java-frontend-4.9.0.9858.jar的.jar文件位於基本聲納-java-plugin-4.9.0.9858.jar和我的custom-java-rules-1.0-SNAPSHOT 。罐。 我的調試運行顯示,SonarQube似乎為擴展目錄中的每個插件.jar啟動了單獨的類加載器。 因此,就SQ而言,確實有2'org.sonar.java.xml.maven.PomCheck'類。 因此我原來的問題。

我因此嘗試從我的自定義規則.jar中刪除java-frontend-4.9.0.9858.jar(以及PomCheck類),將所有與聲納相關的依賴關系作為<provided>進行定義。 我希望得到的SQ進程會有1個PomCheck類來統治它們。 然而,實際結果是SQ甚至沒有啟動,因為無法找到(TA DA)類PomCheck而嘗試加載我的自定義規則類時Web服務器進程失敗。

因為我在我的自定義.jar中包含了PomCheck,所以我覺得它已經達到了一個不可解決的困境 - SQ開始很好但是我不認識我的自定義規則是一個“真正的”PomCheck。 如果我在我的自定義.jar中不包含PomCheck,則SQ將無法啟動。 所以現在我真的陷入了困境 - 請幫忙。

額外細節

Re:Nicholas 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中看到它們並將它們添加到Quality Gate。 規則PackageNaming / LoggingLevels和規則UseParentPOM之間的唯一區別是UseParentPOM實現PomCheck接口,而不是JavaCheck。 然而,由於類PomCheck只是類JavaCheck的包裝器,這似乎是注冊UseParentPom類的正確方法,例如就像任何其他JavaCheck一樣。 但也許不是嗎?

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

更多細節

根據Java自定義規則教程 ,必須通過將它們提供給getJavaChecks (針對源文件進行檢查)或getJavaTestChecks (針對測試文件進行檢查)來​​激活自定義規則。 問題是pom.xml文件不屬於這兩個類別中的任何一個,它們屬於“XML文件桶”,對其進行特定的規則檢查。

想象這樣的一個好方法是在SonarJava的目光CheckList.java ,注意專用getXmlChecksgetMavenChecks 這些是實際針對Scanner索引的XML文件運行的檢查。

具體來說

雖然您可以自由地為getJavaChecksgetJavaTestChecks添加自定義規則,但SonarJava API不支持向getMavenChecks添加規則(您可以嘗試但它實際上什么都不做)。 您的整體分析非常明確,但事實是只有包含api的軟件包才能通過類加載器( 示例 )訪問,而不是PomCheck的情況。

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

“開箱即用思考”的建議

SonarXML使用XPath表達式支持自定義規則(請參閱擴展指南 )。 有了一點XPath體操,你可以考慮擴展規則xml:XPathCheck - 跟蹤違反XPath規則的行為

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM