작성
·
235
0
해당 스펙의 gradle설정 해보신분 이 계신다면 답변달아주시면 너무 감사하겠습니다ㅠㅠㅠ
가상스레드를 사용할예정이라 java 21,
querydsl,lombok을 포함하여 개발을 시작했습니다 (이후 mapstruct를 추가함)
처음설정은 어찌저찌 일일이 지정해가면서 빌드할때 compileQuerydls 태스크만 돌린다던지
querydsl관련 설정을 덕지덕지 붙여서 어떻게 생성시키고 돌아가게는 만들었던것 같습니다.
하지만 기존 설정이 mapstruct를 붙이게 되면서 문제가 생겼고 (anotationprocessor문제로 추정)
java21에서는 querydsl의 directory path 설정이라던지 기타 설정없이도 qclass가 생긴다하여
build.gradle 파일을 수정하며 삽질중인데 잘 해결되지 않아 질문글을 남기게 되었습니다.
제가 생각하기로는 lombok과querydsl,mapstruct의 anotationprocessor가 호환이 안되던지
분리해주어야 하거나 추가 설정이 필요해서 되지 않는 것인가 추측해보았습니다.
일단 기존 querydsl, lombok만 설정했던 소스와 현재 수정중인 소스를 첨부합니다
[기존파일] querydsl,lombok 설정
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
apply plugin: 'com.ewerk.gradle.plugins.querydsl'
group = 'kr.co.aaa'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// Validation 관련 추가 의존성
implementation 'jakarta.validation:jakarta.validation-api:3.0.2'
implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-quartz'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// QueryDSL 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' // QueryDSL JPA 의존성
implementation 'com.querydsl:querydsl-core'
implementation 'com.querydsl:querydsl-collections'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' // QueryDSL의 JPAAnnotationProcessor
annotationProcessor 'jakarta.annotation:jakarta.annotation-api' // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드
annotationProcessor 'jakarta.persistence:jakarta.persistence-api' // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드
//netty
implementation 'io.netty:netty-all:4.1.97.Final' // Netty 전체 라이브러리
}
// Querydsl 설정부
def generated = file('src/main/generated') // src/main/generated 경로 지정
querydsl {
library = 'com.querydsl:querydsl-apt'
jpa = true
querydslSourcesDir = generated
}
sourceSets {
main {
java {
srcDirs += "src/main/generated" // generated 폴더를 소스 경로에 추가
}
}
}
tasks.withType(JavaCompile).configureEach {
options.annotationProcessorPath = configurations.annotationProcessor
options.generatedSourceOutputDirectory.set(generated) // Q 클래스가 src/main/generated에 생성되도록 설정
}
// compileQuerydsl 태스크가 이미 존재하는지 확인하고, 없을 경우에만 등록
if (!tasks.names.contains("compileQuerydsl")) {
tasks.register("compileQuerydsl", JavaCompile) {
source = sourceSets.main.java.srcDirs
classpath = sourceSets.main.compileClasspath // Main classpath 설정
options.annotationProcessorPath = configurations.annotationProcessor
destinationDirectory.set(generated) // 생성 경로 설정
}
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
configurations {
querydsl.extendsFrom compileClasspath
}
// gradle clean 시에 QClass 디렉토리 삭제
clean {
delete file("src/main/generated")
}
tasks.named('test') {
useJUnitPlatform()
}
[수정중인 파일] querydsl,lombok,mapstruct이 되도록 빌드하고자 했었음
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'kr.co.artlab'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '21'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-quartz'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
implementation 'jakarta.validation:jakarta.validation-api:3.0.2'
implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final'
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
implementation 'io.netty:netty-all:4.1.97.Final'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
runtimeOnly 'org.postgresql:postgresql'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// Querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
}
tasks.named('test') {
useJUnitPlatform()
}
clean {
delete file('src/main/generated')
}
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
송아름님께서 QueryDSL, Lombok 및 MapStruct와 함께 Java 21 환경에서의 build.gradle
설정 문제를 접하셨군요. 특히, Annotaion Processor의 호환성 문제로 인한 오류가 발생하는 것으로 보입니다. 송아름님과 유사한 문제를 겪고 해결한 사례들이 있어, 아래에 관련한 해결책 게시물을 소개해 드리겠습니다.
이 문서는 QueryDSL, Lombok, MapStruct와 같은 애노테이션 프로세서가 포함된 환경에서 발생할 수 있는 일반적인 설정 문제를 설명합니다. 몇 가지 주요 포인트를 간단히 요약하자면:
AnnotationProcessor 설정: 각 프로세서가 제대로 동작하도록 하기 위해선 annotationProcessor
종속성을 올바르게 나열하고 구성해야 합니다. 이 경우, 순서를 신경 써야 할 수도 있습니다.
Java 21의 추가 설정: Java 21의 새로운 기능이나 변경된 부분이 기존의 라이브러리와 충돌하지 않도록 하기 위해선 종속성의 버전을 확인하고, 필요한 경우 다른 라이브러리 버전으로의 업데이트가 필요할 수 있습니다.
Gradle의 동작 원리 이해기: 특정 환경 설정이나 의존성이 추가될 때 Gradle의 빌드 순서와 타스크 실행을 확실히 이해하는 것이 중요합니다.
제안해드린 링크를 참고하시고, build.gradle
설정을 재확인해 보세요. 이와 같은 복잡한 설정은 각 라이브러리의 문서를 함께 보고, 최신 버전을 사용해보는 것도 좋은 방법입니다.
저는 질문자님의 이해를 돕고자 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.