为啥我在一个环境中的 sbt 中出现冲突的交叉版本,而在另一个环境中却没有?
Posted
技术标签:
【中文标题】为啥我在一个环境中的 sbt 中出现冲突的交叉版本,而在另一个环境中却没有?【英文标题】:Why do I get conflicting cross-version in sbt on one environment but not another?为什么我在一个环境中的 sbt 中出现冲突的交叉版本,而在另一个环境中却没有? 【发布时间】:2015-05-06 21:51:52 【问题描述】:我有一个包含这些依赖项的 sbt 项目:
libraryDependencies ++= Seq(
"org.scalatra" %% "scalatra" % ScalatraVersion,
"org.scalatra" %% "scalatra-scalate" % ScalatraVersion,
"org.scalatra" %% "scalatra-specs2" % ScalatraVersion % "test",
"ch.qos.logback" % "logback-classic" % "1.1.2" % "runtime",
"org.eclipse.jetty" % "jetty-webapp" % "9.1.5.v20140505" % "container",
"org.eclipse.jetty" % "jetty-plus" % "9.1.5.v20140505" % "container",
"javax.servlet" % "javax.servlet-api" % "3.1.0",
"org.sorm-framework" % "sorm" % "0.3.18",
"com.h2database" % "h2" % "1.4.187",
"org.fusesource.scalamd" % "scalamd_2.10" % "1.6"
)
在一台机器上,我可以毫无问题地运行 ./sbt;另一方面,我得到了
[error] Modules were resolved with conflicting cross-version suffixes in file:/C:/dev/scalaspace/game-tracker/game-tracker:
[error] org.scala-lang.modules:scala-xml _2.11, _2.12.0-M1
[error] org.scala-lang.modules:scala-parser-combinators _2.11, _2.12.0-M1
我已经隔离了问题并进行了修复。 Sorm 依赖于 2.12.0-M1 编译器:
[info] +-org.sorm-framework:sorm:0.3.18 [S]
[info] +-com.github.nikita-volkov:embrace:0.1.4 [S]
[info] | +-org.scala-lang:scala-compiler:2.12.0-M1 [S]
[info] | +-org.scala-lang.modules:scala-parser-combinators_2.12.0-M1:1.0.4 [S]
[info] | +-org.scala-lang.modules:scala-xml_2.12.0-M1:1.0.4 [S]
[info] | +-org.scala-lang:scala-reflect:2.11.0 [S] (evicted by: 2.11.6)
[info] | +-org.scala-lang:scala-reflect:2.11.6 [S]
[info] | +-org.scala-lang:scala-reflect:2.12.0-M1 (evicted by: 2.11.0)
我可以通过将exclude("org.scala-lang","scala-compiler")
添加到 sorm 依赖项来使项目在这两个位置构建。但为什么行为不一致?两种环境都使用相同版本的 sbt (0.13.8) 和 scala (2.11.6)。有什么不同?
【问题讨论】:
【参考方案1】:鉴于com.github.nikita-volkov:embrace 的 pom,我猜这是由于使用了版本范围和缓存:
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>[2.10,3)</version>
<scope>compile</scope>
</dependency>
特别是考虑到昨天发布了 Scala 2.12.0-M1:
http://www.scala-lang.org/news/2.12.0-M1要解决您要清除常春藤缓存的不一致问题:
rm -r ~/.ivy2/cache
但是您还想修复 scala-compiler
使用的版本,并且希望它与您配置的 scalaVersion
匹配:
dependencyOverrides += "org.scala-lang" % "scala-compiler" % scalaVersion.value
在图书馆管理文档的Overriding a version 部分查看更多详细信息。
【讨论】:
啊,你说得对。清除我的常春藤缓存导致旧环境以同样的方式中断。强制scala编译器版本的最佳方法是什么?我在依赖项顶部添加了"org.scala-lang" % "scala-compiler" % ScalaVersion
,但仍然出现冲突的跨版本错误。
您想使用dependencyOverrides += "org.scala-lang" % "scala-compiler" % scalaVersion.value
。文档中也有关于它的更多信息:scala-sbt.org/release/docs/…以上是关于为啥我在一个环境中的 sbt 中出现冲突的交叉版本,而在另一个环境中却没有?的主要内容,如果未能解决你的问题,请参考以下文章
由于跨版本后缀冲突,从 Scala 2.11.8 升级到 2.12.10 构建在 sbt 失败