Play! 3.0.2运行时出现NoSuchMethodError:Providers.guicify方法缺失
解决Play! 3.0.2升级后运行时
NoSuchMethodError(Guice guicify方法)问题 从Play! 2.6.0升级到3.0.2版本,修复编译错误启动后,访问localhost:9000触发以下运行时错误:
NoSuchMethodError: 'com.google.inject.Provider com.google.inject.util.Providers.guicify(javax.inject.Provider)' play.api.inject.guice.GuiceableModuleConversions$$anon$4.$anonfun$configure$3(GuiceInjectorBuilder.scala:376) scala.Option.foreach(Option.scala:437) play.api.inject.guice.GuiceableModuleConversions$$anon$4.$anonfun$configure$2(GuiceInjectorBuilder.scala:375) play.api.inject.guice.GuiceableModuleConversions$$anon$4.$anonfun$configure$2$adapted(GuiceInjectorBuilder.scala:372) scala.collection.immutable.List.foreach(List.scala:334) ...
问题根源
核心原因是Guice版本与Play! 3.0.2不兼容:
- Play! 3.0.2官方依赖Guice 6.x版本,而你通过
scala-guice 7.0.0引入了Guice 7.x - Guice 7.x完成Jakarta EE迁移,将
javax.inject包替换为jakarta.inject,导致Providers.guicify方法的参数类型从javax.inject.Provider变为jakarta.inject.Provider - Play! 3.0.2的Guice模块编译时依赖
javax.inject版本的方法签名,运行时加载Guice 7.x后找不到对应方法,触发NoSuchMethodError - 额外风险:
firebase-admin 5.9.0可能自带旧版Guice依赖,加剧类路径冲突
解决方案
1. 对齐Play!官方依赖版本
修改build.sbt,将scala-guice降级到与Play! 3.0.2兼容的版本(对应Guice 6.x):
// 替换原scala-guice依赖 libraryDependencies += "net.codingwell" %% "scala-guice" % "6.0.0"
确保不要启用手动添加的Guice 7.0.0依赖,让Play!的guice模块管理核心Guice版本。
2. 排除第三方依赖中的旧版Guice
给firebase-admin排除自带的Guice依赖,避免版本冲突:
libraryDependencies += "com.google.firebase" % "firebase-admin" % "5.9.0" exclude("com.google.inject", "guice")
3. 彻底清理并重新构建
执行以下命令确保缓存和构建产物完全清理:
sbt clean rm -rf ~/.ivy2/cache ~/Library/Caches/Coursier sbt reload compile run
4. 验证依赖一致性
执行sbt dependencyTree,确认所有Guice相关依赖统一为6.x版本,无7.x或更低版本的冲突项。
内容的提问来源于stack exchange,提问作者xinu3
相关产品推荐
相关产品推荐

