본문 바로가기
JAVA & Spring/Error

[QueryDSL][Spring] Unable to load class 'javax.persistence.Entity' 에러 해결 방법

by 알기 쉬운 코딩 사전 2024. 3. 4.
반응형

🚨 build 시 발생한 에러 메시지

Unable to load class 'javax.persistence.Entity'.

This is an unexpected error. Please file a bug containing the idea.log file.

import com.example.demo.domain.QEntity

 

❓에러 발생 이유

Spring 버전과 QueryDSL의 설정 차이로 발생하게 되는 에러 메시지입니다.

Spring 2.x 버전에서 Spring 3.x 버전으로 올라오면서 Java17버전을 사용하게 되었습니다.

JAVA17 버전의 가장 큰 특징 중 하나는 폴더 구조가 javax에서 jakarta로 변경된 것 입니다.
Spring 2.X 버전과 Spring 3.X 버전의 QueryDSL을 implementation하는 방식이 다릅니다.

즉, Spring 3.X 이상의 버전을 사용하고 있는데,
QueryDSL의 설정은 Spring 2.X 버전의 설정을 사용하고 있을 때 나타나는 에러 메시지입니다.

 

✅ 해결 방법

build.gradle에서 QueryDSL의 implementation 방식을 Spring boot의 버전에 맞게 설정해주시면 됩니다.

각 Spring boot의 버전에 따른 QueryDSL 설정 build.gradle 코드를 참고해 주세요. 

 

Spring boot 3.x 이상 QueryDSL 설정

dependencies {
    // queryDSL 설정
    implementation "com.querydsl:querydsl-jpa:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    implementation "com.querydsl:querydsl-core"
    implementation "com.querydsl:querydsl-collections"
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}: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) 대응 코드
}

// Querydsl 설정부
def generated = 'src/main/generated'

// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
	options.getGeneratedSourceOutputDirectory().set(file(generated))
}

// java source set 에 querydsl QClass 위치 추가
sourceSets {
	main.java.srcDirs += [ generated ]
}

// gradle clean 시에 QClass 디렉토리 삭제
clean {
	delete file(generated)
}

 

Spring boot 2.x QueryDSL 설정

dependencies {
    // queryDSL 설정
    implementation "com.querydsl:querydsl-jpa"
    implementation "com.querydsl:querydsl-core"
    implementation "com.querydsl:querydsl-collections"
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // 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) 대응 코드
}

// Querydsl 설정부
def generated = 'src/main/generated'

// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}

// java source set 에 querydsl QClass 위치 추가
sourceSets {
    main.java.srcDirs += [ generated ]
}

// gradle clean 시에 QClass 디렉토리 삭제
clean {
    delete file(generated)
}

 

반응형

댓글