Gradle生成多Swagger YAML时报inputSpec未配置错误如何解决?
问题修复方案
报错的核心原因是你依赖了OpenAPI Generator插件默认自带的
openApiGenerate任务,该任务你未做任何配置,而你自己动态创建的openApiGenerate[接口名]系列任务没有被加入到构建依赖链中,因此执行构建时会触发默认任务的inputSpec未配置校验。
具体修复步骤
- 收集所有自定义生成任务,替换对默认任务的依赖
- 为每个自定义任务配置统一的输出目录,确保生成的代码能被sourceSet识别编译
- 可选:禁用默认的
openApiGenerate任务避免误触发
- 可选:禁用默认的
修改后的完整配置代码
plugins { kotlin("jvm") id("org.openapi.generator") } sourceSets { main { java.srcDir("$buildDir/generate-resources/main/src/main/kotlin") } } dependencies { val jacksonVersion: String by project implementation(kotlin("stdlib")) testImplementation(kotlin("test-junit")) implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion") implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") } val dir = File("$rootDir/transport/spec/") val swaggerList = dir.walkTopDown().filter { it.name.endsWith(".yaml") }.map { it.name }.toList() // 存储所有自定义生成任务 val customOpenApiTasks = mutableListOf<Task>() swaggerList.forEach { swaggerItem -> val apiName = swaggerItem.replace(".yaml", "") val task = tasks.create( "openApiGenerate${apiName.capitalize()}", org.openapitools.generator.gradle.plugin.tasks.GenerateTask::class ) { val openapiGroup = "${rootProject.group}.openapi" generatorName.set("kotlin") packageName.set(openapiGroup) apiPackage.set("$openapiGroup.api") modelPackage.set("$openapiGroup.models") invokerPackage.set("$openapiGroup.invoker") inputSpec.set("$rootDir/transport/spec/$swaggerItem") // 配置输出目录和sourceSet对应 outputDir.set("$buildDir/generate-resources/main") globalProperties.apply { put("models", "") put("modelDocs", "false") } configOptions.set( mapOf( "dateLibrary" to "string", "enumPropertyNaming" to "UPPERCASE", "serializationLibrary" to "jackson", "collectionType" to "list" ) ) } customOpenApiTasks.add(task) } tasks { // 禁用默认的openApiGenerate任务,避免误执行 openApiGenerate { enabled = false } compileKotlin { // 依赖所有自定义的生成任务 dependsOn(customOpenApiTasks) } }
补充说明
- 如果需要不同yaml生成的代码存放在不同目录避免冲突,可以给每个任务的
outputDir配置独立路径,同时将所有路径都加入sourceSet的srcDir配置中。 - 执行构建前可以先运行
./gradlew tasks查看所有自定义生成任务是否已经正确注册。
内容的提问来源于stack exchange,提问作者rgaponov
相关产品推荐
相关产品推荐

