升级至Play framework 2.6.x时遭遇库依赖冲突问题求助
看起来你在从Play 2.5.x升级到2.6.11时遇到了典型的依赖版本冲突问题,核心根源是间接依赖引入了不同版本的Play框架(2.6.9),进而引发了Guava、Akka等关联库的冲突,同时还有jQuery的webjar版本冲突。下面一步步帮你解决:
一、优先搞定Play版本冲突(2.6.11 vs 2.6.9)
这是所有后续冲突的源头,必须先解决:
统一Play相关库的版本
你当前的play-json用了2.6.8,和主框架版本2.6.11不一致,先把它改成和Play版本对齐:"com.typesafe.play" %% "play-json" % "2.6.11"同时检查所有Play生态的依赖(比如
play-mailer),确保它们的版本和Play 2.6.11兼容。例如play-mailer 6.0.1可以升级到6.0.2(完全适配2.6.x全系列)。定位引入2.6.9的依赖源
运行sbt dependencyTree,搜索关键词play_2.12:2.6.9,就能找到是哪个插件或库间接引入了旧版本。比如你用的sbt-play-ebean或sbt-play-enhancer可能存在版本兼容问题,需要确认插件版本是否适配2.6.11:sbt-play-ebean v4.1.0确实支持Play 2.6.x,但如果它内部依赖了旧版Play,就需要升级插件到更高版本(比如v4.1.1)。sbt-play-enhancer v1.2.2适配Play 2.6.x,应该没问题,但还是要通过依赖树确认。
强制锁定Play版本
如果找不到源头,直接用sbt的dependencyOverrides强制所有Play模块使用2.6.11:dependencyOverrides ++= Seq( "com.typesafe.play" %% "play" % "2.6.11", "com.typesafe.play" %% "play-streams" % "2.6.11", "com.typesafe.play" %% "play-json" % "2.6.11" )
二、处理jQuery版本冲突
你自己引入了jquery:3.2.1,但其他webjar依赖(如kendo-ui-core、jquery-ui)依赖更低版本的jQuery,这里有两个方案:
强制统一为3.2.1(需测试兼容性)
添加依赖覆盖:dependencyOverrides += "org.webjars.bower" % "jquery" % "3.2.1"但要注意:旧版本的kendo-ui-core(2016.2)可能不兼容jQuery 3.x,建议测试页面功能是否正常。如果出现兼容性问题,就用第二个方案。
降级jQuery到兼容版本
把你自己引入的jQuery改成2.2.4,和toastr依赖的版本一致,避免冲突:"org.webjars" % "jquery" % "2.2.4"
三、解决其他库的冲突
1. webjars-locator-core (0.33 vs 0.32)
直接强制使用0.33版本,因为它是更高版本,且和sbt-web 1.4.3兼容:
dependencyOverrides += "org.webjars" % "webjars-locator-core" % "0.33"
2. Guava (22.0 vs 15.0/19.0/20.0)
Play 2.6.11依赖Guava 22.0,强制统一:
dependencyOverrides += "com.google.guava" % "guava" % "22.0"
另外,bonecp已经停止维护,Play 2.6推荐使用HikariCP作为连接池,建议考虑替换掉bonecp,彻底消除这个依赖冲突。
3. Akka (2.5.8 vs 2.4.20/2.5.3)
Play 2.6.11用的是Akka 2.5.8,强制锁定Akka版本:
dependencyOverrides ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.5.8", "com.typesafe.akka" %% "akka-stream" % "2.5.8" )
同时,你的akka-http-core用的是10.0.11(对应Akka 2.4),需要升级到10.1.x系列(适配Akka 2.5),比如10.1.12。
四、验证解决结果
修改完build.sbt后,运行:
sbt clean update evicted
查看evicted的输出,确认所有冲突都被解决,没有可疑的二进制不兼容警告。
内容的提问来源于stack exchange,提问作者Justin

