IT/Java

VSCode ClassNotFoundException 해결

yeTi 2020. 9. 8. 13:57

안녕하세요. yeTi입니다.
오늘은 VSCode를 활용하면서 발생하는 ClassNotFoundException을 해결해보려고 합니다.

작업환경

  • VSCode : 1.48.2

현상

JPA환경에서 Querydsl을 사용하여 개발을 하고 있던 와중에 Debug모드로 구동하니 QClass를 사용하는 과정에서 java.lang.ClassNotFoundException이 발생하였습니다.

2020-09-08 13:39:18.658 ERROR 25152 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: .../QMember] with root cause

java.lang.ClassNotFoundException: ...QMember
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]

이번에 STS로 디버깅모드를 사용하거나 JAR 파일을 구동하면 발생하지 않는것으로 보아, VSCode코드에서 Querydsl의 경로를 인지하지 못하고 있다고 짐작하였습니다.

해결

.classpath를 확인하니 querydsl 설정이 다음과 같이 되어있었습니다.

<classpathentry kind="src" output="bin/querydsl" path="src/main/generated">
    <attributes>
        <attribute name="gradle_scope" value="querydsl"/>
        <attribute name="gradle_used_by_scope" value="querydsl"/>
    </attributes>
</classpathentry>

scopemain과 다르게 잡혀서 디버깅모드에서 인지를 못하고 있다고 판단하여 scope를 다음과 같이 동일하게 맞췄습니다.

<classpathentry kind="src" output="bin/querydsl" path="src/main/generated">
    <attributes>
        <attribute name="gradle_scope" value="main"/>
        <attribute name="gradle_used_by_scope" value="main"/>
    </attributes>
</classpathentry>

이로써 디버깅모드에서 정상적으로 동작하는것을 확인할 수 있습니다.

변경 후 에도 해결이 안되면 workspace를 clean 해봅니다.
Java: Clean the Java language server workspace