Playframework:无法覆盖 sbt 依赖项

Posted

技术标签:

【中文标题】Playframework:无法覆盖 sbt 依赖项【英文标题】:Playframework: cannot override sbt dependency 【发布时间】:2021-03-25 21:08:20 【问题描述】:

这是一个最小的可重现示例:

echo '
   libraryDependencies += "org.apache.jena" % "apache-jena-libs" % "3.17.0" ;
   lazy val testPlay = (project in file(".")) .enablePlugins(PlayScala)
' > build.sbt ;
mkdir project ;
echo 'addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.5")'
  > project/plugins.sbt ;
sbt run 

我依赖于 Java 模块 (Apache Jena),它指定 jackson-core 2.11.3 ,而最新的 Play 是 2.10.4 。在开发模式下无法开始播放:

JsonMappingException: Scala module 2.10.4 requires Jackson Databind version >= 2.10.0 and < 2.11.0.

我试过了:

dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.4"

但不考虑,请检查 show fullClasspathdependencyTree 。 还尝试了 excludeDependencies 两种方式,指定 2.10.4 或 2.11.3 。我的理解是

    SBT excludeDependencies 无法更改 Java 依赖项 函数play.runsupport.Reloader.startDevMode()不是 受主要 SBT 配置影响,因为它是 Play 的一部分 插入 ;确实,Reloader 类不在play-server_2.12-2.8.5.jar

那么我可以尝试什么样的 hack?

sbt 配置。 https://github.com/jmvanel/semantic_forms/blob/master/scala/project/Common.scala#L44

堆栈跟踪:

[error] com.fasterxml.jackson.databind.JsonMappingException: Scala module 2.10.4 requires Jackson Databind version >= 2.10.0 and < 2.11.0
[error]         at com.fasterxml.jackson.module.scala.JacksonModule.setupModule(JacksonModule.scala:61)
[error]         at com.fasterxml.jackson.module.scala.JacksonModule.setupModule$(JacksonModule.scala:46)
[error]         at com.fasterxml.jackson.module.scala.DefaultScalaModule.setupModule(DefaultScalaModule.scala:17)
[error]         at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:819)
[error]         at akka.serialization.jackson.JacksonObjectMapperProvider$.$anonfun$configureObjectMapperModules$4(JacksonObjectMapperProvider.scala:223)
[error]         at akka.serialization.jackson.JacksonObjectMapperProvider$.$anonfun$configureObjectMapperModules$4$adapted(JacksonObjectMapperProvider.scala:222)
[error]         at scala.collection.immutable.List.foreach(List.scala:431)
[error]         at akka.serialization.jackson.JacksonObjectMapperProvider$.configureObjectMapperModules(JacksonObjectMapperProvider.scala:222)
...
[error]         at akka.actor.ActorSystem$.apply(ActorSystem.scala:290)
[error]         at play.core.server.DevServerStart$.$anonfun$mainDev$1(DevServerStart.scala:248)
[error]         at play.utils.Threads$.withContextClassLoader(Threads.scala:22)
[error]         at play.core.server.DevServerStart$.mainDev(DevServerStart.scala:76)

【问题讨论】:

请阅读What should I do when someone answers my question? 【参考方案1】:

您可以通过以下方式强制依赖:

libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.4" force()

另一个选项是排除依赖:

libraryDependencies += "org.apache.jena" % "apache-jena-libs" % "3.17.0" exclude("com.fasterxml.jackson.core", "jackson-databind")

【讨论】:

唉,这并没有改变问题,show fullClasspath 给出了 jackson-databind-2.11.3.jar ,这往往证明“SBT 无法更改 Java 依赖项”跨度> 最小可重现示例:shell echo ' libraryDependencies += "org.apache.jena" % "apache-jena-libs" % "3.17.0" ; lazy val testPlay = (project in file(".")) .enablePlugins(PlayScala) ' &gt; build.sbt ; mkdir project ; echo 'addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.5")' &gt; project/plugins.sbt ; sbt run 确实添加了你的建议,@tomer-shetah,没有解决:libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.4" force() 确实,它适用于玩具项目,尚未适用于我的应用程序,但这是令人鼓舞的 :) 可以阅读该死的 SOF 手册 :) 。现在,我尝试将玩具项目扩展到更能代表我的现实生活应用程序。

以上是关于Playframework:无法覆盖 sbt 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

SBT:多构建依赖/聚合项目中的覆盖设置

覆盖 sbt 中的传递依赖版本 [重复]

play-sbt 2.5.6 插件给出未解决的依赖错误

sbt.build 用于多个项目和 playframework

尝试使用 Play 2.5.3 但 SBT 在解决依赖关系时冻结

SBT 中的排序和覆盖任务