QueryDSL cannot find symbol: javax.annotation.processing.Generated
querydsl 사용 중 Q클래스를 생성한 뒤 프로그램을 실행했을 때 'javax.annotation.processing 패키지에서 Generated class를 찾지 못한다는 오류'가 발생했습니다.
해당 오류는 지난번에도 한번 발생했었는데, 이번에도 같은 오류가 발생했고 오류의 원인이 궁금하여 내용을 찾아보게 되었습니다.
해결 방법
1. 첫 번째 시도
우선 첫 번째로 시도한 방법은 Q클래스의 import javax.annotation.processing.Generated 부분을 import javax.annotation.Generated로 수동으로 바꾸는 것입니다.
import javax.annotation.processing.Generated;
//위를 아래로 수동으로 수정
import javax.annotation.Generated;
이렇게 했을 때 애플리케이션이 정상적으로 동작하는 것을 확인했는데요.
하지만 Q파일을 새로 생성할 때마다 모든 Q파일의 해당 경로를 바꿔주며 작업하는 것은 절대로 효율적이지 못한 방법입니다.
따라서 이 방법은 해결 방법이라고 할 수 없지만, 위 상황을 통해 Generated class의 패키지 경로가 잘못 잡혀있다는 것을 알 수 있었는데요.
2. 두 번째 시도
다음으로 알게 된 것은 java 12, java 17 등의 SDK를 사용할 때는 위 오류가 발생하지만, SDK를 java 1.8으로 변경했을 때는 생성되는 Q파일의 Generated 클래스 경로 자체가 import javax.annotation.Generated로 되어있어 오류가 발생하지 않고 정상적으로 동작한다는 것입니다.
하지만 이 문제를 해결하기 위해 사용하는 sdk 버전을 낮춘다는 것은 잘못된 방식일 수 있는데요.
***
java 1.8이 아닌 상위 버전을 사용할 때, maven 빌드툴을 사용하는 경우 아래 options 부분을 통해 generatedAnnotationClass를 javax.annotation.Generated로 사용하겠다고 지정하여 Q파일 생성 시 자동으로 해당 어노테이션이 사용되도록 설정하는 방법도 있습니다.'
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<options>
<querydsl.generatedAnnotationClass>javax.annotation.Generated</querydsl.generatedAnnotationClass>
</options>
</configuration>
</execution>
</executions>
</plugin>
3. 세 번째 시도
세 번째 시도는 Preferences -> Build, Execution, Deployment -> Compiler -> Java Compiler 부분의 'Pre-module bytecode version' 부분을 통한 해결 방법입니다.
javax.annotation.processing.Generated 경로의 해당 클래스를 못 찾는다는 오류가 발생했을 때, 해당 클래스에 들어가 보면 클래스 상단에 Decompiled .class file, bytecode version: 61.0 (Java 17)이라는 디컴파일된 파일을 읽고 있는 중이라는 문구를 볼 수 있었는데요.
즉, 해당 Generated 클래스의 경우 Java 17로 컴파일되어야 사용할 수 있는데, 해당 프로젝트에 설정된 bytecode version이 1.8으로 설정되어 있기 때문에 컴파일하는 java 버전 차이로 인해 발생된 문제라는 것을 추측해 볼 수 있었는데요.
Target bytecode version 값을 17로 바꾸고 다시 컴파일을 했을 때 javax.annotation.processing.Generated로 지정된 경로도 정상적으로 읽어 동작하는 것을 확인하였습니다.
< 참고 자료 >
https://github.com/redhat-developer/vscode-java/issues/2799
https://blog.jetbrains.com/ko/2020/04/10/java-bytecode-decompiler-ko/