[IntelliJ + Maven + QueryDSL] Failed to execute goal com.mysema.maven:apt-maven-plugin:1.1.3:process 해결
2022.03.23 - [실전 공부] - [Spring Boot] LogBack.xml to Java Config Bean
## 급하신분은 맨 아래 pom.xml부터 보세요 ##
실행 환경
JDK 11.0.9
Maven 3.5.4
Maven compiler 3.8.1
Spring Boot 2.6.6
QueryDSL 4.3.1
[스프링부트 쇼핑몰 with JPA] 책 예제를 통한 학습 중 발생한 문제 해결 기록
Maven 빌드 환경에서 QueryDSL을 사용하기 위해서는 많은 예제가 다음과 같은 의존성 주입을 사용한다.
pom.xml - dependency
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.3.1</version>
</dependency>
pom.xml - plugin
<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>
</configuration>
</execution>
</executions>
</plugin>
하지만 나는 리로드 메이븐 프로젝트를 해도 생성이 안되고 컴파일을 직접 해줄 경우 에러가 발생했다.
Failed to execute goal com.mysema.maven:apt-maven-plugin:1.1.3:process (default) on project shop: java.lang.RuntimeException: java.lang.NoClassDefFoundError: com/mysema/codegen/model/Type
서칭을 통해 QueryDSL 깃허브 레퍼지터리에서 다음과 같은 사용 예제를 찾았다.
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.0.5</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<classifier>apt</classifier>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
</plugin>
위와 같이 작성하고 실행했더니 Q도메인은 잘 생성 된다.
하지만 이젠 다른 곳에서 문제가 생겼다.
JPAQueryFactory를 사용하기 위한 querydsl-jpa 라이브러리를 찾지 못한다.
또, 컴파일 시 package com.querydsl.core.types does not exist 메시지가 나오며 아래 패키지를 찾지 못한다.
하여 querydsl-jpa 라이브러리는 의존성 선언부에, querydsl-apt 는 플러그인 선언부에 나누어 작성하여 빌드하니 Q도메인 생성 및 라이브러리 사용이 모두 정상 동작한다.
그런데 테스트를 돌려보니 이번엔 java.lang.NoClassDefFoundError: com/google/common/collect/Multimap 예외가 뜬다.. 이 클래스는 guava 라이브러리에서 제공하는 클래스다.
그리고 이 클래스는 querydsl-jpa 라이브러리에 들어있다..;;; 테스트 스코프 제외로;;
특별한 이유 없이 나 편하자고 라이브러리 설정을 바꾸는것은 좋지 않아보이니까 querydsl-core 라이브러리를 추가하자.
querydsl-core에는 아래와 같이 guava 라이브러리가 예외 없이 잘 들어있다.
pom.xml (최종_최종_최종)
<project>
{.....}
<dependencies>
{.....}
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-core</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
{.....}
<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>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.3.1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>