Scala项目Play框架从2.3.x升级至2.4.x时出现guicify方法调用错误
问题原因
这个错误是Guice版本冲突导致的:
Play 2.4.x 依赖的Guice版本在4.0及以上,com.google.inject.util.Providers.guicify() 方法是Guice 4.0才新增的API。而你的项目依赖中存在低于4.0版本的Guice包,运行时类加载器优先加载了旧版本Guice,找不到对应方法就抛出了该错误。从错误栈可以看到,旧版本Guice被打包在 ipp-java-qbapihelper-1.2.0-jar-with-dependencies.jar 这个fat jar内。
排查步骤
- 执行依赖树命令排查Guice版本冲突:
如果是sbt项目,执行sbt dependencyTree | grep guice,输出所有依赖的Guice包版本和引入路径
如果是Maven项目,执行mvn dependency:tree | grep guice - 确认是否有依赖引入了预打包旧版Guice的fat jar,比如本次错误中的
ipp-java-qbapihelper这类带jar-with-dependencies后缀的依赖包,这类包会把自身依赖的所有第三方库打包进去,极易引发版本冲突。
解决方案
- 排除冲突的旧版Guice依赖
如果是普通依赖引入的旧版Guice,直接在构建配置中排除即可:
sbt配置示例:
Maven配置示例:"com.example" % "冲突的依赖包名" % "版本号" exclude("com.google.inject", "guice")<dependency> <groupId>com.example</groupId> <artifactId>冲突的依赖包名</artifactId> <version>版本号</version> <exclusions> <exclusion> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> </exclusion> </exclusions> </dependency> - 替换带内置依赖的fat jar
如果你用的是类似本次错误中的ipp-java-qbapihelper-jar-with-dependencies这类fat jar,优先替换为不带内置依赖的普通版本:
若没有普通版本,可手动排除该fat jar,自行声明对应版本的依赖,或者在构建配置中强制指定Guice的版本为Play 2.4要求的版本:// sbt示例,优先使用不打包依赖的版本 "com.intuit.ipp" % "ipp-java-qbapihelper" % "1.2.0"
sbt强制版本配置示例:
Maven强制版本配置示例:dependencyOverrides += "com.google.inject" % "guice" % "4.0"<dependencyManagement> <dependencies> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.0</version> </dependency> </dependencies> </dependencyManagement> - 验证修复结果
重新执行依赖树命令,确认所有Guice依赖版本都为4.0及以上,重启项目验证错误是否消失。
内容的提问来源于stack exchange,提问作者Sree ragh
相关产品推荐
相关产品推荐

