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 규칙을 제외했습니다 . 우리의 정의는 수 규칙 식별자와 사용 제외를 혼합 파일과 일치하는 패턴을 함께 , 각각 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
우리는 다중 기준 의 하위 집합을 정의했습니다 . 두 번째 정의를 추가하여 구성을 확장하고 이름을 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 어노테이션 및 특정 규칙에 의한 제외에 대해 설명했습니다. 이를 위해서는 규칙의 식별자를 찾아야합니다.
분석 속성 구성도 살펴 보았습니다. 우리는 시도 multicriteria 과 sonar-project.properties 파일을.
마지막으로 속성을 pom.xml 로 이동하고 초점을 좁히는 다른 방법을 검토했습니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/sonar-exclude-violations
'Java' 카테고리의 다른 글
Spring 속성 파일에서 배열 및 List 삽입 (0) | 2021.03.23 |
---|---|
자바 생성자 사용방법(예제) (0) | 2021.03.23 |
HttpClient 요청에 매개 변수 추가 (0) | 2021.03.23 |
Java IndexOutOfBoundsException "소스가 대상에 맞지 않음" (0) | 2021.03.22 |
정수의 제곱근이 Java에서 정수인지 확인 (0) | 2021.03.22 |