配置項目以排除某些違反Sonar的檢查

1.概述

在構建期間,我們可以使用各種工具來報告源代碼的質量。這樣的工具之一就是SonarQube,它可以執行靜態代碼分析。

有時我們可能會不同意返回的結果。因此,我們可能希望排除SonarQube錯誤標記的某些代碼。

在這個簡短的教程中,我們將研究如何禁用Sonar檢查。雖然可以在SonarQube的服務器上更改規則集,但我們僅專注於如何在源代碼和項目配置中控制單個檢查。

2.違例

讓我們看一個例子:

public void printStringToConsoleWithDate(String str) {

 System.out.println(LocalDateTime.now().toString() + " " + str);

 }

默認情況下,由於違反java:S106規則,SonarQube將此代碼作為Code Smell報告:

配置項目以排除某些違反聲納的行為

但是,讓我們想像一下,對於這個特定的類,我們已經確定使用System.out記錄是有效的。也許這是一個輕量級的實用程序,它將在容器中運行,並且不需要整個日誌記錄庫即可記錄到stdout

我們應該注意,在SonarQube用戶界面中也可以將違規標記為假陽性。但是,如果在多台服務器上分析了代碼,或者重構後該行移至另一個類,則衝突將再次出現。

有時,我們希望在源代碼存儲庫中進行排除,以使它們持久存在。

因此,讓我們看看如何通過配置項目將這些代碼從SonarQube報告中排除。

3.使用// NOSONAR

我們可以通過在末尾NOSONAR // NOSONAR**來禁用一行代碼**:

System.out.println(

 LocalDateTime.now()

 .toString() + " " + str); //NOSONAR lightweight logging

該行末尾的// NOSONAR標記禁止顯示可能出現的所有問題。此方法適用於SonarQube支持的大多數語言

我們還可以在NOSONAR之後NOSONAR一些其他註釋, NOSONAR解釋為什麼我們禁用了該支票。

讓我們繼續前進,看看禁用Java的特定於Java的方法。

4.使用@SuppressWarnings

4.1。註釋代碼

在Java中,我們可以使用內置的@SuppressWarnings批註排除Sonar檢查

我們可以註釋該函數:

@SuppressWarnings("java:S106")

 public void printStringToConsoleWithDate(String str) {

 System.out.println(LocalDateTime.now().toString() + " " + str);

 }

這與抑制編譯器警告完全相同。我們要做的就是指定規則標識符,在本例中為java:S106

4.2。如何獲取標識符

我們可以使用SonarQube用戶界面獲取規則標識符。在查看違規時,可以單擊“ Why is this an issue?

配置項目以排除某些違反聲納的行為

它向我們顯示了定義。由此我們可以在右上角找到規則標識符:

配置項目以排除某些違反聲納的行為

5.使用sonar-project.properties

我們還可以使用分析屬性sonar-project.properties文件中定義排除規則

讓我們定義sonar-project.properties文件並將其添加到我們的資源目錄中:

sonar.issue.ignore.multicriteria=e1



 sonar.issue.ignore.multicriteria.e1.ruleKey=java:S106

 sonar.issue.ignore.multicriteria.e1.resourceKey=**/SonarExclude.java

我們剛剛宣布了我們的第一個[multicriteria](https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/) e1 。我們為SonarExclude類排除了java:S106規則。我們的定義可以在規則ruleKeyresourceKey屬性中使用規則標識符和文件匹配模式將排除項混合在一起,分別在e1名稱標籤之前。

使用這種方法,我們可以構建一個複雜的配置,以排除多個文件中的特定規則:

sonar.issue.ignore.multicriteria=e1,e2



 # Console usage - ignore a single class

 sonar.issue.ignore.multicriteria.e1.ruleKey=java:S106

 sonar.issue.ignore.multicriteria.e1.resourceKey=**/SonarExclude.java

 # Too many parameters - ignore the whole package

 sonar.issue.ignore.multicriteria.e2.ruleKey=java:S107

 sonar.issue.ignore.multicriteria.e2.resourceKey=com/baeldung/sonar/*.java

我們剛剛定義了multicriteria的子集。通過添加第二個定義並將其命名為e2我們擴展了配置。然後,我們將兩個規則組合在一個子集中,用逗號分隔名稱。

6.禁用使用Maven

也可以使用Maven屬性應用所有分析屬性Gradle中也提供了類似的機制。

6.1。 Maven中的Multicriteria in

回到示例,讓我們修改pom.xml

<properties>

 <sonar.issue.ignore.multicriteria>e1</sonar.issue.ignore.multicriteria>

 <sonar.issue.ignore.multicriteria.e1.ruleKey>java:S106</sonar.issue.ignore.multicriteria.e1.ruleKey>

 <sonar.issue.ignore.multicriteria.e1.resourceKey>

 **/SonarExclude.java

 </sonar.issue.ignore.multicriteria.e1.resourceKey>

 </properties>

此配置的工作原理與在sonar-project.properties文件中使用的配置完全相同。

6.2。縮小焦點

有時,經過分析的項目可能包含一些我們想排除的生成代碼,並縮小了SonarQube檢查的重點

讓我們通過在pom.xml定義sonar.exclusions來排除類:

<properties>

 <sonar.exclusions>**/SonarExclude.java</sonar.exclusions>

 </properties>

在這種情況下,我們已按名稱排除了單個文件。將檢查除一個文件以外的所有文件。

我們還可以使用文件匹配模式。讓我們通過定義以下內容來排除整個程序包:

<properties>

 <sonar.exclusions>com/baeldung/sonar/*.java</sonar.exclusions>

 </properties>

另一方面,通過使用sonar.inclusions屬性,我們可以要求SonarQube僅分析項目文件的特定子集:

<properties>

 <sonar.inclusions>com/baeldung/sonar/*.java</sonar.inclusions>

 </properties>

此代碼段僅定義對com.baeldung.sonar包中的Java文件的分析。

最後,我們還可以定義sonar.skip值:

<properties>

 <sonar.skip>true</sonar.skip>

 </properties>

這從SonarQube檢查中排除了整個Maven模塊。

7.結論

在本文中,我們討論了在代碼中取消某些SonarQube分析的不同方法。

我們從排除單個行的檢查開始。然後,我們討論了內置的@SuppressWarnings註釋和根據特定規則的排除。這要求我們找到規則的標識符。

我們還研究了配置分析屬性。我們嘗試了multicriteriasonar-project.properties文件。

最後,我們將屬性移到pom.xml並查看了其他縮小焦點的方法。