scala - 什么时候在 Scala 中使用 SBT 和 Ivy 模棱两可地选择具有相同定义和类路径的两个类?

标签 scala playframework sbt classpath ivy

在 Scala 中,使用 sbt,我很好奇如果我:

  1. 在两个不同命名的库中定义两个具有相同名称、定义和类路径的不同类(想象 case class User(name: String, age: Int) 在两个地方,但是一个有 要求(年龄 >= 0))
  2. 依赖于build.sbt中的这两个库
  3. 在成功编译并通过测试的代码中引用该类
  4. 将该代码发布为库,然后在其他地方运行

我的具体问题是,这些类在哪些点上选择不明确?也就是说,在编译、发布和应用程序启动过程的哪些点上,流行的类可能会在一个定义和另一个定义之间交替其他?

这是针对 Play Framework 应用程序的,但我认为这没有什么不同。这也适用于 SBT v0.13,它使用 Ivy 进行依赖管理。

最佳答案

如果类路径上存在两个具有完全相同的完全限定名称的类,那么加载哪个类取决于它们在类路径中出现的顺序。我们可以通过执行

看到Compile类路径上的顺序
show Compile / fullClasspath

比如项目multi1依赖于common1common2,那么在下面的场景中

sbt:multi1> show Compile / fullClasspath
[info] * Attributed(/Users/mario_galic/code/stackoverflow/sbt-multi-project-example/multi1/target/scala-2.12/classes)
[info] * Attributed(/Users/mario_galic/code/stackoverflow/sbt-multi-project-example/common2/target/scala-2.12/classes)
[info] * Attributed(/Users/mario_galic/code/stackoverflow/sbt-multi-project-example/common1/target/scala-2.12/classes)

类形式 common2 将被加载,因为它在类路径中位于 common1 之前。我们可以类似地检查 Runtime classpath

上的顺序
show Runtime / fullClasspath

我相信没有什么比开箱即用的顺序优先级更智能的了。

作为旁注,sbt 确实提供了 eviction warnings在同一库的不同版本的情况下得到解决。

关于scala - 什么时候在 Scala 中使用 SBT 和 Ivy 模棱两可地选择具有相同定义和类路径的两个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62561113/

相关文章:

scala - mongodb数据库与scala play 2.0教程

git - 组织多个 Scala 相互关联的 sbt 和 git 项目 - 最佳实践建议

scala - 在不计算的情况下获取 Spark 数据帧中的行数

scala - Slick对numThreads和最佳性能感到困惑

scala - 无法使用 scalamock 模拟 WSRequest.post()

scala - SBT 通用build设置

java - 奇怪的 sbt 错误,由于键与自身发生冲突,我无法导入 sbt 项目

scala - 实例化 'org.apache.spark.sql.hive.HiveSessionState'时出错:在Linux服务器上

scala - 写入 HDFS - hive 时如何控制 Spark 流中的行数和/或输出文件大小?

scala - 包和项目的命名约定