我在 sbt 中有两个模块:
top
和common
。 top
取决于 common
,并且 common
在 src/main/resources/application.conf
中有一些配置,这些配置在 src/test/resources/application.conf
中被覆盖。
当我在 intellij 中从
top
运行测试时,一切正常。但是使用 sbt 运行不起作用,因为来自 common 的 main
在 test
之前出现在类路径上。
基本上,对于顶级模块(
top
),它做了正确的事情,将测试类放在类之前,但对于依赖项,顺序是相反的:
top/target/test-classes,top/target/classes,common/target/classes,common/target/test-classes
这似乎是一个错误,但我最感兴趣的是某种可以用来快速解锁的解决方法,最好不更改实际代码(例如,我知道我可以重命名测试中的文件,然后让 Config 读取)首先,但这似乎......令人讨厌:/)。有什么想法吗?
我实际上发现这篇文章似乎正在谈论我的问题并提供了解决方案,但是当我尝试将
Test / dependencyClasspath ~= { println("FOO"); cp => cp.sortBy(f => f.data.getName ) }
添加到build.sbt时(我知道这不是正确的顺序,但仍然应该做一些事情) ),没有任何区别(并且不打印任何内容)。
.settings
中:
def fixClasspath(cp: Seq[Attributed[File]]): Seq[Attributed[File]] = cp
.groupBy { case x => if (x.data.getName == "test-classes") 1 else if (x.data.getName == "classes") 2 else 3 }
.toSeq
.sortBy(_._1)
.flatMap(_._2)
lazy val top = (project in file("top"))
.dependsOn("common" % "test -> test; compile -> compile")
.settings(Test / dependencyClasspath ~= fixClasspath)