Spring Boot 3.0.2集成QueryDSL时Q文件重复生成错误排查
问题分析与解决方案
错误原因
Attempt to recreate a file for type com.joshua.system.common.audit.QTimeEntity 是因为QueryDSL的Q文件被重复生成,核心原因是APT注解处理器被多次触发。结合你的Gradle配置,问题出在第三方QueryDSL插件与原生annotationProcessor配置冲突,同时存在依赖版本不一致的情况。
Spring Boot 3.x 对 QueryDSL 的影响
Spring Boot 3.x 全面切换到Jakarta EE规范(替代原Java EE),QueryDSL需要适配这一变化:
- 必须使用带
:jakarta后缀的依赖包(如com.querydsl:querydsl-jpa:5.0.0:jakarta) - APT处理器也要对应选择Jakarta版本
- Gradle 7+原生支持通过
annotationProcessor配置生成Q文件,不再强制依赖第三方插件
修正后的Gradle配置
移除冲突插件与重复配置,统一依赖版本:
plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } group = 'com.joshua' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } compileOnly { extendsFrom annotationProcessor } } ext { set('springCloudVersion', "2022.0.1") } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-hateoas' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-config' implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp' implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'org.springframework.cloud:spring-cloud-circuitbreaker-resilience4j' implementation 'org.springframework.cloud:spring-cloud-starter-sleuth' implementation 'org.springframework.cloud:spring-cloud-starter-zipkin:2.2.8.RELEASE' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation 'org.projectlombok:lombok' implementation 'org.mapstruct:mapstruct:1.5.5.Final' implementation 'org.modelmapper:modelmapper:2.3.8' implementation 'io.micrometer:micrometer-registry-prometheus' implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'org.junit.jupiter:junit-jupiter:5.9.0' // QueryDSL Jakarta 适配版本 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor([ "org.projectlombok:lombok", "org.mapstruct:mapstruct-processor:1.5.5.Final", // 与implementation版本统一 "com.querydsl:querydsl-apt:5.0.0:jakarta", "jakarta.persistence:jakarta.persistence-api", "jakarta.annotation:jakarta.annotation-api" ]) compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } tasks.named('test') { useJUnitPlatform() } // 配置QueryDSL生成目录,避免与其他生成文件冲突 def querydslDir = "$buildDir/generated/querydsl" sourceSets { main.java.srcDirs += querydslDir } // 确保clean时删除生成目录,避免旧文件残留 tasks.clean.doLast { file(querydslDir).deleteDir() }
关键修改点说明
- 移除第三方QueryDSL插件:
com.ewerk.gradle.plugins.querydsl插件与原生annotationProcessor配置冲突,导致重复生成Q文件,Gradle 7+原生方式即可满足需求。 - 统一MapStruct版本:将
annotationProcessor中的mapstruct-processor版本改为与implementation一致的1.5.5.Final,消除依赖冲突。 - 清理重复配置:删除重复定义的
configurations { compileOnly { extendsFrom annotationProcessor } }。 - 添加生成目录清理:在clean任务中删除QueryDSL生成目录,避免旧文件残留引发的重复生成问题。
执行clean build即可解决当前错误。
内容的提问来源于stack exchange,提问作者joshua.kim
相关产品推荐
相关产品推荐

