테스트 시 발생하는 위험 메시지 무시해보기

2024. 5. 1. 23:28스프링 (Spring)/스프링 팁 (Spring Tip)


Background

 

사실 이 글을 작성하면서 조금 께름칙하네요.

모름지기 시스템에서 뱉는 불편하다는 메시지는 잘 알고 해결해야될 듯 한데,

이번 경우는 더 파고들어도 뭐가 안 나오고, 크게 걱정 없다는 조언? 들이 있어서 무시해보기로 합니다.

 

우리 시간은 소중하고, 짜증나는 빨간색 글씨를 없애기 위함이죠

 

 

 

 

 

 


A Java agent has been loaded dynamically

 

첫 번째 Warning입니다.

WARNING: A Java agent has been loaded dynamically (/home/park/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.14.12/be4984cb6fd1ef1d11f218a648889dfda44b8a15/byte-buddy-agent-1.14.12.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release

 

이렇게 생겼는데, 검색해보니 어렵지 않게 뜨거운 감자를 찾을 수 있었네요.

 

JDK 21 - Dynamic Loading of Agent (byte-buddy-agent-1.14.4.jar) · Issue #3037 · mockito/mockito

Based on trying to run Mockito with a simple example project on JDK 21 (EA build) result into the following WARNING: [INFO] Running com.soebes.jdk21.AFinalClassTest OpenJDK 64-Bit Server VM warning...

github.com

 

테스트 시 사용했던 mockito와 jdk21 간에 뭐가 있나보네요.

내용이 조금 어지럽긴 한데 원칙적으로 jdk에서는 라이브러리가 동적으로 agent를 부르는 것을 금하고 있지만,

현재로써는 -XX:+EnableDynamicAgentLoading 옵션으로 허용하도록 했고, 미래에는 언제든 막을 수 있다고 하네요.

여튼 그 시점이 되면 mockito 말고 다른 걸 쓰든, 업그레이드를 하든 해야겠네요.

 

메시지를 무시하려면 아래처럼 build.gradle.kts 파일의 jvmArgs에 추가해주면 됩니다.

tasks.withType<Test> {
    useJUnitPlatform()
    jvmArgs(
        "-XX:+EnableDynamicAgentLoading"
    )
}

 

 

 

 

 

 


OpenJDK 64-Bit Server VM warning

 

두 번째 Warning 입니다.

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

 

이게 무엇이냐... 찾아보니 아래에서 꽤 명료한 설명을 발견할 수 있었네요. 

 

"Sharing is only supported for boot loader classes because bootstrap classpath has been appended" when running with java 13 · I

Hi, I am getting the following warning when tracing my java 13 application: OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been ...

github.com

 

Application Class-Data Sharing이라는 게 어플리케이션 수준에서 클래스 메타 데이터를 미리 만들어놓고,

다음 번에 실행될 때 해당 데이터를 가져다 쓰므로 시작 성능을 높히는 건가보군요.

jdk에서는 class-data archive에 쓰는데, 어플리케이션은 bootstrap 클래스 경로를 참조하다보니

결국 class-data archive가 무의미하여 최적화가 일부 안되었다... 뭐 이런 이야기 같습니다.

 

여튼 어플리케이션 환경에는 문제가 없으니 무시해도 될 듯 합니다.

따라서 메시지를 무시하려면 아래처럼 build.gradle.kts 파일의 jvmArgs에 추가해주면 됩니다.

tasks.withType<Test> {
    useJUnitPlatform()
    jvmArgs(
        "-Xshare:off"
    )
}

 

 

 

 

 

 


Summary

 

// build.gradle.kts

tasks.withType<Test> {
    useJUnitPlatform()
    jvmArgs(
        "-XX:+EnableDynamicAgentLoading",
        "-Xshare:off"
    )
}