문제 해결 기록

[IntelliJ + Maven + QueryDSL] Failed to execute goal com.mysema.maven:apt-maven-plugin:1.1.3:process 해결

타태 2022. 4. 9. 18:27

 

2022.03.23 - [실전 공부] - [Spring Boot] LogBack.xml to Java Config Bean

 

[Spring Boot] LogBack.xml to Java Config Bean

2022.03.21 - [문제 해결 기록] - [Spring boot X Spring Security] CORS 설정하기 [Spring boot X Spring Security] CORS 설정하기 2022.03.14 - [실전 공부/Java&Spring&SpringBoot] - [REACT x SPRING BOOT] A..

ktae23.tistory.com

 

 

## 급하신분은 맨 아래 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>

 

반응형