こんにちは、私たちの組織内で統合テストを処理する SBT ビルド ファイルがあります。テスト自体は機能し、ユニットとテストを個別に実行できます。ただし、アプリを sbt-assembly でパッケージ化する場合、コンパイル時にメモリ不足になるため、両方のテストを順番に実行することはできません (ユニット ++ it)。sbt.Project とその設定は次のとおりです。
import BuildSettings._
import Dependencies._
import Resolvers._
val name = "api"
lazy val api = Project(
name, file("."),
settings = buildSettings
++ Seq(resolvers := repositories, libraryDependencies ++= dependencies)
++ SbtStartScript.startScriptForClassesSettings
++ Revolver.settings
++ assemblySettings
++ Seq(jarName := name + "-" + currentGitBranch + ".jar")
).configs(IntegrationTest)
.settings(Defaults.itSettings: _*)
.settings(parallelExecution in IntegrationTest := false)
.settings(parallelExecution in Test := true)
.settings(scalaSource in IntegrationTest := baseDirectory.value / "src/test/scala")
.settings(resourceDirectory in IntegrationTest := baseDirectory.value / "src/test/resources")
.settings(
testOptions in IntegrationTest := Seq(Tests.Filter(itFilter)),
testOptions in Test := Seq(Tests.Filter(unitFilter))
)
.settings(parallelExecution in Compile := true)
.settings(fork in Compile := true)
.settings(sources in (Compile, doc) := Seq.empty)
.settings(test in assembly := Seq(
(test in Test).value ,
(test in IntegrationTest).value
))
def currentGitBranch = {
"git rev-parse --abbrev-ref HEAD".lines_!.mkString.replaceAll("/", "-").replaceAll("heads-", "")
}
def itFilter(name: String): Boolean = name endsWith "IT"
def unitFilter(name: String): Boolean = !itFilter(name)
ご覧のとおり、(test in assembly := { ... }) を使用して、タスク assembly::test 中に実行するテストを指定しましたが、実行するsbt assembly
と失敗します
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:GC オーバーヘッド制限を超えました
2つ(ユニット/ it)テストのうち1つだけを使用してみましたが、なんとかコンパイルできましたが、両方が必要です。何か提案はありますか?前もって感謝します。
編集:sbtを実行しようとしSBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"
ましたが、エラーに別のメッセージがありました。java.lang.OutOfMemoryError: Java heap space