如何在 sbt-assembly jar 中包含测试依赖项?
How to include test dependencies in sbt-assembly jar?
我无法将我的测试依赖项打包到我的测试程序集 jar 中。这是我的 build.sbt
:
的摘录
...
name := "project"
scalaVersion := "2.10.6"
assemblyOption in (Compile, assembly) := (assemblyOption in (Compile, assembly)).value.copy(includeScala = false)
fork in Test := true
parallelExecution in IntegrationTest := false
lazy val root = project.in(file(".")).configs(IntegrationTest.extend(Test)).settings(Defaults.itSettings: _ *)
Project.inConfig(Test)(baseAssemblySettings)
test in (Test, assembly) := {}
assemblyOption in (Test, assembly) := (assemblyOption in (Test, assembly)).value.copy(includeScala = false, includeDependency = true)
assemblyJarName in (Test, assembly) := s"${name.value}-test.jar"
fullClasspath in (Test, assembly) := {
val cp = (fullClasspath in Test).value
cp.filter{ file => (file.data.name contains "classes") || (file.data.name contains "test-classes")} ++ (fullClasspath in Runtime).value
}
libraryDependencies ++= Seq(
...
"com.typesafe.play" %% "play-json" % "2.3.10" % "test" excludeAll ExclusionRule(organization = "joda-time"),
...
)
...
当我 assemble 我的 fat jar 使用 sbt test:assembly
时,生成了 fat jar project-test.jar
,但是 play-json
依赖项没有打包到:
$ jar tf /path/to/project-test.jar | grep play
$
但是,如果我从 play-json
dep(即 "com.typesafe.play" %% "play-json" % "2.3.10" excludeAll ExclusionRule(organization = "joda-time")
)中删除 "test"
配置,我可以看到它被包含在内:
$ jar tf /path/to/project-test.jar | grep play
...
play/libs/Json.class
...
$
我做错了什么吗and/or 遗漏了什么?我的目标是仅将 play-json
库包含在 test:assembly
jar 而不是 assembly
jar
我在上面发布的原始 build.sbt
摘录中遗漏了一个关键部分,结果证明这是问题的原因:
fullClasspath in (Test, assembly) := {
val cp = (fullClasspath in Test).value
cp.filter{ file => (file.data.name contains "classes") || (file.data.name contains "test-classes")} ++ (fullClasspath in Runtime).value
}
此代码块实质上是从测试类路径中过滤掉依赖项。我们包含它是为了避免痛苦的合并冲突。我通过添加逻辑以包含所需的 play-json
dep 来修复此问题:
fullClasspath in (Test, assembly) := {
val cp = (fullClasspath in Test).value
cp.filter{ file =>
(file.data.name contains "classes") ||
(file.data.name contains "test-classes") ||
// sorta hacky
(file.data.name contains "play")
} ++ (fullClasspath in Runtime).value
}
我无法将我的测试依赖项打包到我的测试程序集 jar 中。这是我的 build.sbt
:
...
name := "project"
scalaVersion := "2.10.6"
assemblyOption in (Compile, assembly) := (assemblyOption in (Compile, assembly)).value.copy(includeScala = false)
fork in Test := true
parallelExecution in IntegrationTest := false
lazy val root = project.in(file(".")).configs(IntegrationTest.extend(Test)).settings(Defaults.itSettings: _ *)
Project.inConfig(Test)(baseAssemblySettings)
test in (Test, assembly) := {}
assemblyOption in (Test, assembly) := (assemblyOption in (Test, assembly)).value.copy(includeScala = false, includeDependency = true)
assemblyJarName in (Test, assembly) := s"${name.value}-test.jar"
fullClasspath in (Test, assembly) := {
val cp = (fullClasspath in Test).value
cp.filter{ file => (file.data.name contains "classes") || (file.data.name contains "test-classes")} ++ (fullClasspath in Runtime).value
}
libraryDependencies ++= Seq(
...
"com.typesafe.play" %% "play-json" % "2.3.10" % "test" excludeAll ExclusionRule(organization = "joda-time"),
...
)
...
当我 assemble 我的 fat jar 使用 sbt test:assembly
时,生成了 fat jar project-test.jar
,但是 play-json
依赖项没有打包到:
$ jar tf /path/to/project-test.jar | grep play
$
但是,如果我从 play-json
dep(即 "com.typesafe.play" %% "play-json" % "2.3.10" excludeAll ExclusionRule(organization = "joda-time")
)中删除 "test"
配置,我可以看到它被包含在内:
$ jar tf /path/to/project-test.jar | grep play
...
play/libs/Json.class
...
$
我做错了什么吗and/or 遗漏了什么?我的目标是仅将 play-json
库包含在 test:assembly
jar 而不是 assembly
jar
我在上面发布的原始 build.sbt
摘录中遗漏了一个关键部分,结果证明这是问题的原因:
fullClasspath in (Test, assembly) := {
val cp = (fullClasspath in Test).value
cp.filter{ file => (file.data.name contains "classes") || (file.data.name contains "test-classes")} ++ (fullClasspath in Runtime).value
}
此代码块实质上是从测试类路径中过滤掉依赖项。我们包含它是为了避免痛苦的合并冲突。我通过添加逻辑以包含所需的 play-json
dep 来修复此问题:
fullClasspath in (Test, assembly) := {
val cp = (fullClasspath in Test).value
cp.filter{ file =>
(file.data.name contains "classes") ||
(file.data.name contains "test-classes") ||
// sorta hacky
(file.data.name contains "play")
} ++ (fullClasspath in Runtime).value
}