配置項目以排除某些違反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
規則。我們的定義可以在規則ruleKey
和resourceKey
屬性中使用規則標識符和文件匹配模式將排除項混合在一起,
分別在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
註釋和根據特定規則的排除。這要求我們找到規則的標識符。
我們還研究了配置分析屬性。我們嘗試了multicriteria
和sonar-project.properties
文件。
最後,我們將屬性移到pom.xml
並查看了其他縮小焦點的方法。