如何搭建各模块带独立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
相关产品推荐
相关产品推荐

