Java/Spring/Gradle栈下能否为生成的OpenApi规范文件指定特定包名
解决方案
我们可以通过OpenAPI Generator Gradle插件的多任务配置+导入映射能力实现需求,具体配置如下:
1. 引入OpenAPI Generator Gradle插件
在项目根目录的build.gradle中引入对应插件:
plugins { id 'org.springframework.boot' version '2.7.14' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'java' id "org.openapi.generator" version "6.6.0" } // 常规项目配置 group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() }
2. 配置公共模块代码生成任务
单独配置任务生成公共模型,指定包名为com.common.modules,仅生成模型类即可:
task generateCommonCode(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) { generatorName = "spring" inputSpec = "$projectDir/openapi/common_modules.yaml".toString() outputDir = "$buildDir/generated-sources/common".toString() modelPackage = "com.common.modules" configOptions = [ generateApis: "false", generateModels: "true", generateSupportingFiles: "false", interfaceOnly: "true" ] } // 将公共模块生成的代码加入编译路径 sourceSets.main.java.srcDir "$buildDir/generated-sources/common/src/main/java"
3. 配置业务项目代码生成任务
核心是配置importMappings和schemaMappings,指定引用的TestModule对应公共包下的类,要求生成器不重复生成该类,直接引用对应包路径即可:
task generateSpecificCode(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) { generatorName = "spring" inputSpec = "$projectDir/openapi/spec.yaml".toString() outputDir = "$buildDir/generated-sources/specific".toString() apiPackage = "com.specific.project1.api" modelPackage = "com.specific.project1.model" // 核心配置:映射公共模型的包路径 importMappings = [ "TestModule": "com.common.modules.TestModule" // 后续新增公共模型直接在这里追加映射即可 ] // 告诉生成器不要生成已映射的公共模型,避免重复 schemaMappings = [ "TestModule": "com.common.modules.TestModule" ] configOptions = [ interfaceOnly: "true", skipDefaultInterface: "true", generateApis: "true", generateModels: "true", generateSupportingFiles: "false" ] dependsOn generateCommonCode } // 将业务生成代码加入编译路径 sourceSets.main.java.srcDir "$buildDir/generated-sources/specific/src/main/java" // 编译任务关联代码生成任务 compileJava.dependsOn generateSpecificCode
效果验证
配置完成后执行gradle build命令,生成的业务接口类中会自动导入import com.common.modules.TestModule;,不会在业务包下重复生成TestModule类,符合预期。
如果公共模型需要跨多个业务项目复用,建议单独拆分为独立子模块打包发布,业务项目直接依赖公共模块包即可,无需在每个项目中重复生成公共模型代码。
内容的提问来源于stack exchange,提问作者energy2522
相关产品推荐
相关产品推荐

