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

如何编写多项目SBT文件?实现独立/批量构建Jar包及公共依赖

多子项目SBT构建方案(支持单独/批量打Jar包)

没问题,我来帮你实现这个多子项目的SBT构建需求!下面是完整的配置方案,既能满足单独构建某个子项目Jar包,也能一键构建所有子项目,还能统一管理公共依赖。

第一步:先理清项目结构

首先咱们得把项目目录搭好,顶层项目下每个子项目单独一个文件夹,另外别忘了SBT插件的配置:

your-root-project/
├── project/
│   └── plugins.sbt   # 存放SBT插件配置
├── project-A/         # 子项目A
│   └── src/
├── project-B/         # 子项目B
│   └── src/
├── project-C/         # 子项目C
│   └── src/
└── build.sbt          # 核心构建配置

第二步:配置SBT插件(plugins.sbt)

因为要打可执行Jar包,咱们需要用到sbt-assembly插件,在project/plugins.sbt里添加:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0") // 可以换成最新稳定版本

第三步:编写build.sbt核心配置

下面的配置会帮你实现:统一公共依赖、定义子项目、自定义批量构建任务。

// 全局设置:所有子项目共享的Scala版本和公共依赖
ThisBuild / scalaVersion := "2.13.12" // 换成你实际需要的Scala版本
ThisBuild / libraryDependencies ++= Seq(
  "com.typesafe.scala-logging" %% "scala-logging" % "3.9.5" // 公共依赖,所有子项目自动继承
)

// 定义子项目A
lazy val projectA = (project in file("project-A"))
  .settings(
    name := "project-A",
    version := "1.0.0", // 子项目版本号,按需修改
    // 子项目A专属依赖(如果有的话)
    // libraryDependencies += "xxx" %% "xxx" % "x.x.x"
  )

// 定义子项目B
lazy val projectB = (project in file("project-B"))
  .settings(
    name := "project-B",
    version := "1.0.0"
    // 同理,可添加子项目B专属依赖
  )

// 定义子项目C
lazy val projectC = (project in file("project-C"))
  .settings(
    name := "project-C",
    version := "1.0.0"
    // 同理,可添加子项目C专属依赖
  )

// 自定义批量构建任务:一键构建所有子项目的Jar包
lazy val assemblyAll = taskKey[Unit]("Build assembly JARs for all subprojects")
assemblyAll := {
  (projectA / assembly).value
  (projectB / assembly).value
  (projectC / assembly).value
  println("✅ All subproject assembly JARs have been built successfully!")
}

第四步:使用方法

现在你就可以用命令行执行构建了:

  • 单独构建某个子项目:比如构建project-A的Jar包,直接执行

    sbt project-A/assembly
    

    对应的Jar包会生成在project-A/target/scala-<你的版本>/project-A-assembly-1.0.0.jar(版本号可在子项目settings里修改)

  • 一键构建所有子项目:执行咱们自定义的任务

    sbt assemblyAll
    

    执行后三个子项目的Jar包都会各自生成在对应的target目录下。

额外说明

  1. 如果子项目之间有依赖关系(比如project-A依赖project-B),可以在子项目定义里用.dependsOn(projectB)来配置,SBT会自动处理构建顺序。
  2. 你可以给每个子项目单独配置assembly的自定义规则(比如排除重复依赖、指定主类),只需要在对应子项目的settings里添加配置,比如:
    assembly / mainClass := Some("com.yourpackage.MainA") // 指定project-A的主类
    

内容的提问来源于stack exchange,提问作者Dogil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:18