1. 개요

빌드하는 동안 다양한 도구를 사용하여 소스 코드의 품질을보고 할 수 있습니다. 이러한 도구 중 하나는 정적 코드 분석을 수행하는 SonarQube 입니다.

때때로 우리는 반환 된 결과에 동의하지 않을 수 있습니다. 따라서 SonarQube에서 잘못 표시 한 일부 코드제외 하고자 할 수 있습니다 .

이 짧은 예제에서는 Sonar 검사를 비활성화하는 방법을 살펴 보겠습니다. SonarQube 서버에서 규칙 세트를 변경할 수 있지만, 프로젝트의 소스 코드 및 구성 내에서 개별 검사를 제어하는 ​​방법에만 초점을 맞출 것입니다.

2. 위반 사례

예를 살펴 보겠습니다.

public void printStringToConsoleWithDate(String str) {
    System.out.println(LocalDateTime.now().toString() + " " + str);
}

기본적으로 SonarQube java : S106 규칙 위반 으로 인해이 코드를 코드 냄새보고합니다 .

그러나이 특정 클래스에 대해 System.out 을 사용한 로깅 이 유효하다고 결정했다고 가정 해 봅시다 . 아마도 이것은 컨테이너에서 실행될 경량 유틸리티이며 stdout 에 로그하기 위해 전체 로깅 라이브러리가 필요하지 않을 수도 있습니다 .

SonarQube 사용자 인터페이스 내에서 위반을 오탐으로 표시 할 수도 있습니다. 그러나 코드가 여러 서버에서 분석되거나 리팩토링 후 라인이 다른 클래스로 이동하면 위반이 다시 나타납니다.

때때로 우리는 소스 코드 리포지토리 내에서 예외를 만들어 지속되도록 만들고 싶습니다.

이제 프로젝트를 구성하여 SonarQube 보고서에서이 코드를 제외하는 방법을 살펴 보겠습니다.

3. // NOSONAR 사용

끝에 // NOSONAR 을 추가하여 한 줄의 코드를 비활성화 할 수 있습니다 .

System.out.println(
  LocalDateTime.now()
    .toString() + " " + str); //NOSONAR lightweight logging

줄 끝에 있는 // NOSONAR 태그는 발생할 수있는 모든 문제를 억제합니다. 이 접근 방식은 SonarQube에서 지원하는 대부분의 언어에서 작동합니다 .

또한 NOSONAR 뒤에 수표를 비활성화 한 이유를 설명하는 몇 가지 추가 설명을 넣을 수 있습니다.

앞으로 나아가서 검사를 비활성화하는 Java 관련 방법을 살펴 보겠습니다.

4. @SuppressWarnings 사용

4.1. 코드 어노테이션 달기

자바에서는 내장 @SuppressWarnings 어노테이션을 사용하여 Sonar 검사를 제외 할 수 있습니다 .

함수에 어노테이션을 달 수 있습니다.

@SuppressWarnings("java:S106")
public void printStringToConsoleWithDate(String str) {
    System.out.println(LocalDateTime.now().toString() + " " + str);
}

이것은 컴파일러 경고를 억제하는 것과 똑같은 방식으로 작동합니다. 우리가해야 할 일은 규칙 식별자를 지정하는 것 뿐입니다 ( 이 경우 java : S106) .

4.2. 식별자를 얻는 방법

SonarQube 사용자 인터페이스를 사용하여 규칙 식별자를 얻을 수 있습니다. 위반 사항을 확인할 때 왜 이것이 문제입니까?를 클릭 할 수 있습니다 . :

정의를 보여줍니다. 여기에서 오른쪽 상단 모서리에서 규칙 식별자를 찾을 수 있습니다.

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

우리는 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

우리는 다중 기준 의 하위 집합을 정의했습니다 . 두 번째 정의를 추가하여 구성을 확장하고 이름을 e2로 지정했습니다  . 그런 다음 두 규칙을 하나의 하위 집합으로 결합하여 이름을 쉼표로 구분했습니다.

6. Maven 사용 비활성화

모든 분석 속성은 Maven 속성을 사용하여 적용 할 수도 있습니다 . Gradle 에서도 유사한 메커니즘을 사용할 수 있습니다 .

6.1. Maven의 다중 기준 

예제로 돌아가서 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 로 이동하고 초점을 좁히는 다른 방법을 검토했습니다.