테스트 실행 오류

wjdghks95·2024년 8월 14일

Junit5 테스트 코드를 작성하고 테스트를 실행하였더니 아래와 같은 오류가 발생했다.

Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/platform/engine/TestDescriptor
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:375)
	at com.intellij.rt.junit.JUnitStarter.getAgentClass(JUnitStarter.java:241)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:222)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.TestDescriptor
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	... 5 more

찾다보니 해당 에러는 명령줄 명령이 너무 길어서 그럴수 있다고 한다.
https://stackoverflow.com/questions/69844720/intellij-2021-2-3-exception-in-thread-main-java-lang-noclassdeffounderror-org

run command 길이가 OS limit를 넘으면 실행할 수 없게 된다고 한다. 이를 해결하기 위해서는 Run/Debug Configuration에서 Shorten command line의 옵션을 수정해야 했다.
그래서 아래와 같이 JAR manifest 옵션을 적용해 주었더니 잘 동작하는 것을 확인했다.

각 옵션의 기능은 아래와 같다.

  • None: 기본 옵션 값. IDE에서 긴 classpath를 줄여주지 않는다. command line이 OS limit를 초과하는 경우 IDEA는 애플리케이션을 실행할 수 없다.
  • JAR Manifest: IDE는 임시 claspath.jar를 사용해서 긴 classpath 사용을 회피한다. 실제 classpath는 classpath.jar의 MANIFEST.MF 안에 정의되어 있다.
  • @argfile: 커맨드 라인 인수가 매우 긴 경우 "@" 기호 뒤에 인수 파일의 경로를 지정하여 인수를 파일에서 읽어오도록 하는 기능입니다.

내 프로젝트의 경우 @argfile이 적용되어 있었다. 하지만 이 옵션이 적용된 경우에도 종속성이 너무 많아서 명령줄 명령이 너무 길어진게 에러의 이유인듯하다.
https://orhun.nl/blog/IntelliJ+NoClassDefFoundError/

0개의 댓글