You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala多子项目测试代码打包为单个Jar的实现方法咨询

Scala多项目测试代码打包方案

针对sbt构建的Scala多项目,下面分别给出两种场景的打包方法:

1. 打包所有子项目的测试代码为单个Jar

步骤1:引入sbt-assembly插件

在项目根目录的project/plugins.sbt文件中添加插件依赖(可替换为最新版本):

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")

步骤2:配置根项目的打包任务

在根目录的build.sbt中,修改根项目配置,添加聚合所有子项目测试代码的assembly任务:

// 定义各个子项目
lazy val projectA = (project in file("project-a"))
lazy val projectB = (project in file("project-b"))
lazy val projectC = (project in file("project-c"))
lazy val projectD = (project in file("project-d"))

lazy val root = (project in file("."))
  .aggregate(projectA, projectB, projectC, projectD)
  .settings(
    assembly := {
      // 收集所有子项目的测试编译类文件目录
      val testClassDirs = (classDirectory in Test).all(ScopeFilter(inProjects(projectA, projectB, projectC, projectD))).value
      // 收集所有子项目的测试资源文件目录
      val testResDirs = (resourceDirectory in Test).all(ScopeFilter(inProjects(projectA, projectB, projectC, projectD))).value
      
      // 整理所有需要打包的文件
      val allTestFiles = testClassDirs.flatMap(dir => (dir ** "*").get) ++ testResDirs.flatMap(dir => (dir ** "*").get)
      // 指定打包后的Jar路径和名称
      val outputJar = target.value / "all-tests-assembly.jar"
      
      // 执行assembly打包逻辑
      sbtassembly.AssemblyPlugin.assemblyTask(
        fullClasspath := (fullClasspath in Test).value,
        assemblyInputs := allTestFiles,
        assemblyOutput := outputJar,
        assemblyMergeStrategy := sbtassembly.MergeStrategy.defaultMergeStrategy
      ).value
      outputJar
    }
  )

步骤3:执行打包

在项目根目录运行命令:

sbt assembly

打包完成后,根目录的target文件夹下会生成all-tests-assembly.jar,包含所有子项目的测试类、测试资源以及依赖。


2. 打包部分子项目(如project-a、project-b)的测试代码为单个Jar

只需调整上面的配置,仅指定需要打包的子项目即可:

步骤1:引入sbt-assembly插件(同场景1的步骤1)

步骤2:修改根项目配置

在build.sbt中,将ScopeFilter中的子项目改为仅包含projectA和projectB:

lazy val projectA = (project in file("project-a"))
lazy val projectB = (project in file("project-b"))
lazy val projectC = (project in file("project-c"))
lazy val projectD = (project in file("project-d"))

lazy val root = (project in file("."))
  .aggregate(projectA, projectB) // 可选,仅聚合需要的子项目
  .settings(
    assembly := {
      val testClassDirs = (classDirectory in Test).all(ScopeFilter(inProjects(projectA, projectB))).value
      val testResDirs = (resourceDirectory in Test).all(ScopeFilter(inProjects(projectA, projectB))).value
      
      val allTestFiles = testClassDirs.flatMap(dir => (dir ** "*").get) ++ testResDirs.flatMap(dir => (dir ** "*").get)
      val outputJar = target.value / "ab-tests-assembly.jar"
      
      sbtassembly.AssemblyPlugin.assemblyTask(
        fullClasspath := (fullClasspath in Test).value,
        assemblyInputs := allTestFiles,
        assemblyOutput := outputJar,
        assemblyMergeStrategy := sbtassembly.MergeStrategy.defaultMergeStrategy
      ).value
      outputJar
    }
  )

步骤3:执行打包

运行命令:

sbt assembly

完成后,根目录target下会生成ab-tests-assembly.jar,仅包含project-a和project-b的测试代码及相关依赖。


内容的提问来源于stack exchange,提问作者Dang Huy Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:32:11