STS 4中如何自动添加MapStruct生成的构建源文件?
问题描述
在STS 4中编译项目后,QueryDSL能自动将生成的源文件(输出目录为各项目的src/main/generated/querydsl)添加到构建源中,但MapStruct无法实现这一自动添加功能——它默认输出目录是build/generated/sources/annotationProcessor/java/main。手动添加源文件后代码可正常运行,但希望像QueryDSL一样自动完成源文件的添加。
以下是现有Gradle配置片段:
根build.gradle
buildscript { ext { springBootVersion = '2.7.2' dependencyManagementVersion = '1.0.12.RELEASE' mysqlVersion = '8.0.30' lombokVersion = '6.5.0.3' queryDslVersion = '4.4.0' queryDslPluginVersion = '1.0.10' mapStructVersion = '1.5.3.Final' lombokMapstructBindingVersion = "0.2.0" } repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}" classpath "io.spring.gradle:dependency-management-plugin:${dependencyManagementVersion}" classpath "io.freefair.gradle:lombok-plugin:${lombokVersion}" // for QueryDSL classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${queryDslPluginVersion}" } } subprojects { group = 'test.test' version '0.0.1-SNAPSHOT' apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' apply plugin: 'io.freefair.lombok' apply plugin: 'com.ewerk.gradle.plugins.querydsl' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { compile group: 'com.querydsl', name: 'querydsl-jpa' annotationProcessor group: 'com.querydsl', name: 'querydsl-apt' // for QueryDSL // implementation "com.querydsl:querydsl-core:${queryDslVersion}" // implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" // annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jpa" annotationProcessor "jakarta.persistence:jakarta.persistence-api" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "org.mapstruct:mapstruct-processor:${mapStructVersion}" implementation "org.mapstruct:mapstruct:${mapStructVersion}" annotationProcessor "org.projectlombok:lombok-mapstruct-binding:${lombokMapstructBindingVersion}" testImplementation 'junit:junit:4.12' } } // for QueryDSL task cleanGeneatedDir(type: Delete) { delete file('src/main/generated') }
子项目build.gradle
dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa' implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.11' implementation 'com.querydsl:querydsl-jpa:4.4.0' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test' } def querydslDir = "src/main/generated/querydsl" querydsl { library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl } configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath }
解决方案
QueryDSL的Gradle插件已经自动将其生成目录添加到了Gradle的sourceSets中,所以STS能自动识别;而MapStruct默认没有这个配置,需要手动将其生成目录加入sourceSets,让Gradle和STS自动识别。
方法1:子项目单独配置
修改子项目的build.gradle,添加MapStruct生成目录到源码集,并确保编译任务依赖于注解处理器生成任务:
dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa' implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.11' implementation 'com.querydsl:querydsl-jpa:4.4.0' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test' } def querydslDir = "src/main/generated/querydsl" // 定义MapStruct生成文件目录 def mapstructGeneratedDir = "build/generated/sources/annotationProcessor/java/main" querydsl { library = "com.querydsl:querydsl-apt" jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir // 将MapStruct生成目录添加到主源码集 main.java.srcDirs += mapstructGeneratedDir } compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl } // 确保编译Java任务等待注解处理器生成文件完成 compileJava.dependsOn(processResources) configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath }
方法2:根项目统一配置(推荐)
如果所有子项目都使用MapStruct,可以在根build.gradle的subprojects块中统一添加配置,避免重复设置:
subprojects { group = 'test.test' version '0.0.1-SNAPSHOT' apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' apply plugin: 'io.freefair.lombok' apply plugin: 'com.ewerk.gradle.plugins.querydsl' sourceCompatibility = '11' repositories { mavenCentral() } // 新增:配置MapStruct生成目录 def mapstructGeneratedDir = "build/generated/sources/annotationProcessor/java/main" sourceSets { main.java.srcDirs += mapstructGeneratedDir } compileJava.dependsOn(processResources) dependencies { compile group: 'com.querydsl', name: 'querydsl-jpa' annotationProcessor group: 'com.querydsl', name: 'querydsl-apt' // for QueryDSL // implementation "com.querydsl:querydsl-core:${queryDslVersion}" // implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" // annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jpa" annotationProcessor "jakarta.persistence:jakarta.persistence-api" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "org.mapstruct:mapstruct-processor:${mapStructVersion}" implementation "org.mapstruct:mapstruct:${mapStructVersion}" annotationProcessor "org.projectlombok:lombok-mapstruct-binding:${lombokMapstructBindingVersion}" testImplementation 'junit:junit:4.12' } }
验证配置
- 执行Gradle的
clean和compileJava任务,触发MapStruct生成源文件 - 在STS中刷新Gradle项目(右键项目 → Gradle → Refresh Gradle Project)
- 检查STS的Project Explorer中是否自动出现
build/generated/sources/annotationProcessor/java/main目录,且其中的MapStruct生成类能被正常识别
内容的提问来源于stack exchange,提问作者Wooyoung Tyler Kim
相关产品推荐
相关产品推荐

