Programming/Error

(querydsl) cannot find symbol: javax.annotation.processing.Generated

Jan92 2023. 4. 19. 22:22

QueryDSL cannot find symbol: javax.annotation.processing.Generated

cannot find symbol class Generated

querydsl 사용 중 Q클래스를 생성한 뒤 프로그램을 실행했을 때 'javax.annotation.processing 패키지에서 Generated class를 찾지 못한다는 오류'가 발생했습니다.

해당 오류는 지난번에도 한번 발생했었는데, 이번에도 같은 오류가 발생했고 오류의 원인이 궁금하여 내용을 찾아보게 되었습니다.

 


해결 방법

javax.annotation.processing.Generated

1. 첫 번째 시도

우선 첫 번째로 시도한 방법은 Q클래스의 import javax.annotation.processing.Generated 부분을 import javax.annotation.Generated로 수동으로 바꾸는 것입니다.

 

import javax.annotation.processing.Generated;
//위를 아래로 수동으로 수정
import javax.annotation.Generated;

이렇게 했을 때 애플리케이션이 정상적으로 동작하는 것을 확인했는데요.

하지만 Q파일을 새로 생성할 때마다 모든 Q파일의 해당 경로를 바꿔주며 작업하는 것은 절대로 효율적이지 못한 방법입니다.

 

따라서 이 방법은 해결 방법이라고 할 수 없지만, 위 상황을 통해 Generated class의 패키지 경로가 잘못 잡혀있다는 것을 알 수 있었는데요.

 

 

Project Settings -> Project -> SDK

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>

 

 

Java Compiler

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/