在 Scala 中,使用 sbt,我很好奇如果我:
- 在两个不同命名的库中定义两个具有相同名称、定义和类路径的不同类(想象
case class User(name: String, age: Int)
在两个地方,但是一个有要求(年龄 >= 0)
) - 依赖于
build.sbt
中的这两个库 - 在成功编译并通过测试的代码中引用该类
- 将该代码发布为库,然后在其他地方运行
我的具体问题是,这些类在哪些点上选择不明确?也就是说,在编译、发布和应用程序启动过程的哪些点上,流行的类可能会在一个定义和另一个定义之间交替其他?
这是针对 Play Framework 应用程序的,但我认为这没有什么不同。这也适用于 SBT v0.13,它使用 Ivy 进行依赖管理。
最佳答案
如果类路径上存在两个具有完全相同的完全限定名称的类,那么加载哪个类取决于它们在类路径中出现的顺序。我们可以通过执行
看到Compile
类路径上的顺序
show Compile / fullClasspath
比如项目multi1
依赖于common1
和common2
,那么在下面的场景中
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/