我有一个简单的SBT项目,包括src/main/scala
中的一些Scala代码和src/test/scala
中的一些测试代码。我使用sbt-assembly
插件创建一个胖jar,用于部署到远程系统上。胖jar包含Scala项目的所有依赖项,包括Scala运行时本身。一切都很好。
现在我想弄清楚我可以对胖罐运行Scala测试的方法。我尝试了显而易见的事情,创建一个新的配置扩展Test
配置并修改dependencyClasspath
为胖JAR而不是默认值,但是这失败因为(我假设因为)scala运行时包含在胖罐中并以某种方式发生碰撞使用已加载的scala运行时。
我的解决方案现在有效,但它有严重的缺点。我只是使用Fork.java
在org.scalatest.tools.Runner
运行器上调用Java,类路径设置为包含测试代码和胖jar以及所有测试依赖项。缺点是没有SBT测试丰富度,没有testQuick
,没有testOnly
,测试失败报告是stdout。
我的问题可以归结为:当这些测试不依赖于相应的SBT compile
输出时,如何使用SBT的测试命令来运行测试,而是依赖于包含所有scala运行时的胖JAR文件?
尝试将胖jar添加到测试类路径的第一个位置,就像这样
Test / fullClasspath := Attributed.blank((assembly / assemblyOutputPath).value) :: (Test / fullClasspath).value.toList
在这里,assemblyOutputPath
给出了脂肪罐的路径。我的理解是JVM加载它在类路径上遇到的first class,所以实际上我们将测试fat jar。
我们可以像这样在自定义命令testAgainstFatJar
中捕获这个想法
commands += Command.command("testAgainstFatJar") { state =>
"set assembly / test := {}" ::
"assembly" ::
"set Test / fullClasspath := Attributed.blank((assembly / assemblyOutputPath).value) :: (Test / fullClasspath).value.toList" ::
"test" :: state
}
检查胖罐确实在show Test / fullClasspath
的第一个位置