You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'
    }
}

验证配置

  1. 执行Gradle的clean和compileJava任务,触发MapStruct生成源文件
  2. 在STS中刷新Gradle项目(右键项目 → Gradle → Refresh Gradle Project)
  3. 检查STS的Project Explorer中是否自动出现build/generated/sources/annotationProcessor/java/main目录,且其中的MapStruct生成类能被正常识别

内容的提问来源于stack exchange,提问作者Wooyoung Tyler Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:55:47