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 fullClasspath
和 dependencyTree
。
还尝试了 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) ' > build.sbt ; mkdir project ; echo 'addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.8.5")' > project/plugins.sbt ;
sbt run
确实添加了你的建议,@tomer-shetah,没有解决:libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.4" force()
确实,它适用于玩具项目,尚未适用于我的应用程序,但这是令人鼓舞的 :)
可以阅读该死的 SOF 手册 :) 。现在,我尝试将玩具项目扩展到更能代表我的现实生活应用程序。以上是关于Playframework:无法覆盖 sbt 依赖项的主要内容,如果未能解决你的问题,请参考以下文章
sbt.build 用于多个项目和 playframework