如何强制 Scala 使用不同的库版本?

Posted

技术标签:

【中文标题】如何强制 Scala 使用不同的库版本?【英文标题】:How to force Scala to use a different library version? 【发布时间】:2017-02-09 02:00:48 【问题描述】:

添加后

libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test"

build.sbt,并刷新项目,我得到了这个消息。

SBT 项目导入

[警告] 具有相同组织/名称的多个依赖项,但 不同的版本。为避免冲突,请选择一个版本:

[警告] * org.scala-lang.modules:scala-xml_2.11:(1.0.5, 1.0.4)

Changing the above到

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "3.0.0" % "test"
  exclude("org.scala-lang", "scala-reflect")
  exclude("org.scala-lang.modules", "scala-xml_2.11")
)

解决了这个问题。但是,我不想从 scalatest 中排除 scala-xml_2.11 版本 1.0.5,我想force the scala compiler 使用 scala-xml_2.11 版本 1.0.5 而不是 1.0.4 版本。 (我研究了https://mvnrepository.com 的版本。)因此我尝试用scalaVersion := "2.11.8" 替换

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % "2.11.8",
  "org.scala-lang.modules" % "scala-xml_2.11" % "1.0.5"
)

然而这会导致

SBT 项目导入

[warn] 依赖的二进制版本 (2.11) org.scala-lang#scala-reflect;2.11.8

[warn] in default#myproject$sources_javadoc_2.10;1.0 不同 来自项目 (2.10) 中的 Scala 二进制版本。

[warn] 依赖的二进制版本 (2.11) org.scala-lang#scala-library;2.11.8

[warn] in default#myproject$sources_javadoc_2.10;1.0 不同 来自项目 (2.10) 中的 Scala 二进制版本。

[警告] 具有相同组织/名称的多个依赖项,但 不同的版本。为避免冲突,请选择一个版本:

[警告] * org.scala-lang:scala-library:(2.11.8, 2.10.4)

[警告] * org.scala-lang:scala-reflect:(2.11.8, 2.10.4)

[警告] [失败] com.artima.supersafe#supersafe_2.10.4;1.1.0!supersafe_2.10.4.jar(src): (0ms)

[警告] ==== 本地:尝试过

[警告] /home/user/.ivy2/local/com.artima.supersafe/supersafe_2.10.4/1.1.0/srcs/supersafe_2.10.4-sources.jar

[warn] ==== activator-local: 试过 [warn] /Development/Activator/activator-dist-1.3.10/repository/com.artima.supersafe/supersafe_2.1... (显示气球)

我该怎么办?

编辑:还有什么我尝试过但没有奏效:

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % scalaVersion.value,
  "org.scala-lang.modules" %% "scala-xml" % "1.0.5"
)

// ScalaTest
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test"

[警告] 具有相同组织/名称的多个依赖项,但 不同的版本。为避免冲突,请选择一个版本:[warn] * org.scala-lang.modules:scala-xml_2.11:(1.0.5, 1.0.4)


scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % scalaVersion.value,
  "org.scala-lang.modules" %% "scala-xml_2.11" % "1.0.5"
)

// ScalaTest
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test"

错误:导入 SBT 项目时出错:...

[信息] 正在解决 org.scala-sbt#run;0.13.8 ... [信息] 正在解决 org.scala-sbt#task-system;0.13.8 ... [信息] 正在解决 org.scala-sbt#tasks;0.13.8 ... [信息] 正在解决 org.scala-sbt#tracking;0.13.8 ... [信息] 正在解决 org.scala-sbt#cache;0.13.8 ... [信息] 正在解决 org.scala-sbt#testing;0.13.8 ... [信息] 正在解决 org.scala-sbt#test-agent;0.13.8 ... [信息] 正在解决 org.scala-sbt#test-interface;1.0 ... [信息] 正在解决 org.scala-sbt#main-settings;0.13.8 ... [信息] 正在解决 org.scala-sbt#apply-macro;0.13.8 ... [信息] 正在解决 org.scala-sbt#command;0.13.8 ... [信息] 正在解决 org.scala-sbt#logic;0.13.8 ... [信息] 正在解决 org.scala-sbt#precompiled-2_8_2;0.13.8 ... [信息] 正在解决 org.scala-sbt#precompiled-2_9_2;0.13.8 ... [信息] 正在解决 org.scala-sbt#precompiled-2_9_3;0.13.8 ... [trace] 堆栈跟踪 抑制:运行 'last *:update' 以获得完整输出。 [跟踪] 堆栈 跟踪被抑制:完整运行“last :ssExtractDependencies” 输出。 [错误] (:update) sbt.ResolveException: 未解决 依赖:org.scala-lang.modules#scala-xml_2.11_2.11;1.0.5:不是 发现 [错误] (*:ssExtractDependencies) sbt.ResolveException: 未解决的依赖关系: org.scala-lang.modules#scala-xml_2.11_2.11;1.0.5:未找到 [错误] 总时间:4 s,完成时间 01.10.2016 17:46:55

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % scalaVersion.value,
  "org.scala-lang.modules" %% "scala-xml" % "1.0.5"
)

// ScalaTest
libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "3.0.0" % "test"
  exclude("org.scala-lang", "scala-reflect")
  exclude("org.scala-lang.modules", "scala-xml")
)

[警告] 具有相同组织/名称的多个依赖项,但 不同的版本。为避免冲突,请选择一个版本:[warn] * org.scala-lang.modules:scala-xml_2.11:(1.0.5, 1.0.4)

我的build.sbt

name := "MyProject"
version := "0.1.0"
scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % scalaVersion.value,
  "org.scala-lang.modules" %% "scala-xml" % "1.0.5"
)

// ScalaTest
//libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.0"
//libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test"
libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "3.0.0" % "test"
  exclude("org.scala-lang", "scala-reflect")
  exclude("org.scala-lang.modules", "scala-xml_2.11")
)

【问题讨论】:

【参考方案1】:

排除特定传递依赖的方法是这样的:

    运行 sbt evicted 以找出哪些项目依赖项正在拉入过时的库,假设有问题的库是:com.typesafe.slick

    添加以下排除(括号很重要):

    ("com.typesafe" %% "slick" % "3.1.1").exclude("org.scala-lang.modules", "scala-xml_2.11")

    像列出依赖项一样正常添加。

    这将阻止 sbt 包含任何作为 Slick 传递依赖项传入的 scala-xml 版本。

【讨论】:

【参考方案2】:

不要替代;你需要scalaVersionlibraryDependencies。 虽然使用

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-reflect" % scalaVersion.value,
  "org.scala-lang.modules" %% "scala-xml" % "1.0.5"
)

避免在您最终更改 scalaVersion 时出现错误。

通过删除 scalaVersion,您将获得默认的 scalaVersion := "2.10.4"(至少使用您的 SBT 版本/设置),但您的 libraryDependencies 仍需要 2.11。

【讨论】:

你确定你的意思不是“scala-xml_2.11”吗? 这在任何情况下都不起作用(请参阅更新的问题)。 1.注意%%% 之间的区别。 %% 自动添加正确的 Scala 版本后缀(_2.11_2.10)。 2.要消除警告,您可能需要找到使用 scala-xml 1.0.4 的依赖项并将 exclude 添加到它而不是 Scalatest。 1.什么是 SBT 版本?如果是 0.13.8,您可能会遇到github.com/sbt/sbt/issues/1933(即使在这种情况下也很奇怪)。 2. 在命令行执行sbt "; clean; update" 时是否收到警告?如果不是,这只是一个 IDEA 错误。

以上是关于如何强制 Scala 使用不同的库版本?的主要内容,如果未能解决你的问题,请参考以下文章

在纱线工作区中,如何强制解决子项目的依赖关系?

如何切换到不同版本的 Scala? (苹果系统)

sbt无法在项目中导入两个不同版本的elasticsearch库

如何调试 Gradle 为啥使用我在依赖子项目中指定的不同版本的库?

C++ 两个库依赖于相同的库但不同的版本?

AWS Glue ETL 作业的 Scala 和 Java 版本是啥?