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

如何搭建各模块带独立build.sbt的Scala SBT多独立项目

SBT多独立项目(各模块自带build.sbt)配置方案

适配环境:Scala 2.12.2、SBT 1.5.5,最终结构和预期目录布局完全一致,每个子模块可独立维护自身配置,同时支持跨模块依赖。


根目录配置

project/build.properties

指定全局SBT版本,所有子模块统一使用该版本:

sbt.version=1.5.5

project/plugins.sbt

存放全局公共插件,所有子模块自动共享,无特殊需求可先留空。

根目录build.sbt

核心作用是声明所有子项目路径、跨模块依赖关系,公共配置可以统一在这里写,避免每个子模块重复配置:

// 根项目仅做模块聚合,不存放业务代码
lazy val root = (project in file("."))
  .aggregate(common, multi1, multi2)
  .settings(
    name := "sbt-multi-project-example",
    // 跳过根项目的编译、打包动作,避免无源码报错
    publish / skip := true
  )

// 公共模块声明
lazy val common = (project in file("common"))
  .settings(
    scalaVersion := "2.12.2",
    version := "0.1.0"
  )

// 业务模块multi1,依赖common
lazy val multi1 = (project in file("multi1"))
  .dependsOn(common)
  .settings(
    scalaVersion := "2.12.2",
    version := "0.1.0"
  )

// 业务模块multi2,依赖common
lazy val multi2 = (project in file("multi2"))
  .dependsOn(common)
  .settings(
    scalaVersion := "2.12.2",
    version := "0.1.0"
  )

根配置里已经声明的scalaVersion、依赖关系这类公共配置,子模块的build.sbt里不用重复写,除非某个子模块需要单独覆盖配置值。


子模块配置

每个子模块目录下的build.sbt只需要维护自身独有的配置即可,不用重复声明项目路径、跨模块依赖。

common/build.sbt

存放公共模块专属配置,比如通用工具依赖:

name := "common"

libraryDependencies ++= Seq(
  // 示例:公共模块自己的依赖,比如工具包、测试框架
  "org.scalatest" %% "scalatest" % "3.2.10" % Test
)

multi1/build.sbt

存放multi1模块专属的业务配置、业务依赖:

name := "multi1"

libraryDependencies ++= Seq(
  // 写multi1自己的依赖即可,比如Web框架、数据库驱动
)

multi2/build.sbt

存放multi2模块专属的业务配置、业务依赖:

name := "multi2"

libraryDependencies ++= Seq(
  // 写multi2自己的依赖即可
)

目录调整说明

预期结构里每个子模块下的project、target目录不用手动创建:

  • project目录SBT只会读取根目录下的,子模块下留这个目录反而容易引发构建冲突,直接删掉即可
  • target目录是SBT编译自动生成的,不需要提前手动创建

构建验证

配置完成后在根目录执行sbt projects,能看到所有识别到的子项目就说明配置生效:

[info] In file:/your/project/path/sbt-multi-project-example/
[info]     common
[info]     multi1
[info]     multi2
[info]   * root

常用操作:

  • 编译单个模块:执行sbt multi1/compile,会自动先编译依赖的common模块
  • 运行单个模块:执行sbt multi2/run
  • 打包单个模块:执行sbt multi1/package

不要单独进入multi1、multi2目录执行sbt命令,所有构建操作都在根目录执行就行,SBT会自动处理模块间的依赖顺序和编译优先级。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:39:50