拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 配置项目以排除某些违反Sonar的检查

配置项目以排除某些违反Sonar的检查

白鹭 - 2021-11-24 817 0 0

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *