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
相关产品推荐
相关产品推荐

