配置Gradle构建使用Querydsl Jakarta时类找不到错误的解决
项目Gradle配置
plugins { id 'org.springframework.boot' version '3.0.6' id 'io.spring.dependency-management' version '1.1.0' id 'java' } group = 'com.example' version = '1.0' sourceCompatibility = 17 targetCompatibility = 17 repositories { mavenCentral() } dependencyManagement { imports { mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2022.0.2' } } sourceSets { generated { java { srcDirs = ['build/generated/sources/annotationProcessor/java/main'] } } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.springframework.boot:spring-boot-starter-data-rest' annotationProcessor 'org.projectlombok:lombok' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc' runtimeOnly 'de.codecentric:spring-boot-admin-starter-client:3.0.2' testImplementation 'org.springframework.boot:spring-boot-starter-test' testAnnotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' }
构建报错信息
Caused by: java.lang.NoClassDefFoundError: jakarta/persistence/Entity
2023-05-10T11:55:22.519-0500 [ERROR]
[org.gradle.internal.buildevents.BuildExceptionReporter] at
com.querydsl.apt.jpa.JPAAnnotationProcessor.createConfiguration(JPAAnnotationProcessor.java:37)
报错原因
尽管spring-boot-starter-data-jpa已经间接引入了jakarta.persistence-api,但该依赖是通过implementation scope引入的——Gradle中,implementation依赖只会被添加到主编译和运行时类路径,不会自动传递到注解处理器的类路径。而Querydsl的JPA注解处理器(querydsl-apt)在运行时需要读取jakarta.persistence.Entity这类JPA注解类,因此会出现找不到类的错误。
解决方法
将jakarta.persistence-api添加到注解处理器的依赖中,让Querydsl的APT工具能访问到JPA API类:
修改dependencies块,新增一行:
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
修改后的完整dependencies块关键部分如下:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // ... 其他原有依赖 annotationProcessor 'org.projectlombok:lombok' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' // 新增这行 // ... 其他原有依赖 }
添加后重新执行构建,注解处理器就能找到jakarta.persistence.Entity类,报错即可解决。
内容的提问来源于stack exchange,提问作者James

