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
并查看了其他缩小焦点的方法。
0 评论