基于Micronaut的Gradle构建因snakeyaml版本冲突报错NoSuchMethodError
解决方案:解决Micronaut 3.9.1与OpenAPI Generator插件的snakeyaml版本冲突
问题核心
Micronaut 3.9.1通过BOM强制使用snakeyaml 2.0,但该版本移除了SafeConstructor的无参构造方法;而OpenAPI Generator插件6.6.0依赖的swagger-parser 2.1.6仍在调用这个已被移除的方法,Gradle依赖解析优先使用了Micronaut指定的2.0版本,导致NoSuchMethodError。
可行解决方案
1. 升级OpenAPI Generator插件到兼容snakeyaml 2.0的版本
OpenAPI Generator插件7.0.0及以上版本依赖的swagger-parser已更新至支持snakeyaml 2.0的版本(如2.1.12+)。直接升级插件版本即可解决冲突:
// build.gradle plugins { id "org.openapi.generator" version "7.2.0" // 替换为7.x最新稳定版 }
升级后无需额外调整依赖,插件会自动使用兼容的swagger-parser版本,适配snakeyaml 2.0。
2. 单独锁定OpenAPI插件类路径的snakeyaml版本
如果无法升级插件,可通过Gradle的buildscript配置,给OpenAPI Generator插件的类路径单独指定snakeyaml 1.33,避免影响Micronaut项目本身的依赖:
// build.gradle buildscript { repositories { mavenCentral() } dependencies { classpath("org.openapi.generator:openapi-generator-gradle-plugin:6.6.0") { exclude group: 'org.yaml', module: 'snakeyaml' // 排除插件自带的snakeyaml依赖 } classpath("org.yaml:snakeyaml:1.33") // 强制插件使用1.33版本 } } apply plugin: "org.openapi.generator"
这种方式让插件和项目使用不同版本的snakeyaml,互不干扰。
3. 强制升级swagger-parser到兼容版本
在项目中强制指定swagger-parser的版本为2.1.10及以上(该版本已适配snakeyaml 2.0),覆盖插件自带的旧版本:
// build.gradle configurations.all { resolutionStrategy { force "io.swagger.parser.v3:swagger-parser:2.1.10" force "io.swagger.parser.v3:swagger-parser-core:2.1.10" force "io.swagger.parser.v3:swagger-parser-v3:2.1.10" } }
此方案需要确保升级后的swagger-parser与OpenAPI Generator插件6.6.0兼容,测试后确认无其他兼容性问题即可使用。
验证方法
执行以下命令查看依赖树,确认版本是否正确应用:
- 查看插件类路径依赖:
./gradlew dependencies --configuration buildscriptClasspath - 查看项目依赖:
./gradlew dependencies
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

