Scala跨构建:依据Scala二进制版本动态聚合不同子项目
动态调整sbt聚合子项目以适配不同Scala版本
当然可以!sbt完全支持根据当前的scalaBinaryVersion动态调整根项目聚合的子项目集合,完美解决你这种跨构建时部分子项目因依赖限制无法兼容特定Scala版本的问题。下面是具体的实现步骤:
1. 先定义子项目分组
首先把所有子项目按兼容的Scala版本分类,方便后续动态选择:
// 所有子项目的引用 lazy val projectA = (project in file("projectA")) lazy val projectB = (project in file("projectB")) lazy val projectC = (project in file("projectC")) // 仅兼容Scala 2.11 lazy val projectD = (project in file("projectD")) // 仅兼容Scala 2.11 // 分组:仅2.11可用的项目,以及跨版本兼容的项目 lazy val scala211OnlyProjects = Seq(projectC, projectD) lazy val crossVersionProjects = Seq(projectA, projectB)
2. 动态设置根项目的aggregate
在根项目的配置中,通过scalaBinaryVersion.value判断当前构建的Scala版本,然后选择对应的子项目集合进行聚合:
lazy val root = (project in file(".")) .settings( crossScalaVersions := Seq("2.11.12", "2.12.15"), // 声明支持的Scala版本 scalaVersion := "2.11.12" // 默认Scala版本 ) .aggregate( (scalaBinaryVersion.value match { case "2.11" => crossVersionProjects ++ scala211OnlyProjects // 2.11时聚合所有项目 case "2.12" => crossVersionProjects // 2.12时只聚合兼容的项目 }): _* )
3. (可选)给2.11-only子项目添加版本限制
为了避免误操作,你可以直接在这些子项目的配置里指定仅支持Scala 2.11,这样即使尝试用2.12构建它们,sbt会直接给出明确提示:
lazy val projectC = (project in file("projectC")) .settings( crossScalaVersions := Seq("2.11.12"), // 仅允许2.11版本 scalaVersion := "2.11.12" )
额外注意点
- 当后续Spark发布了Scala 2.12兼容的版本后,你只需要把
projectC、projectD从scala211OnlyProjects移到crossVersionProjects,或者直接调整match语句里的集合,就能轻松适配2.12构建。 - 运行跨版本构建时,使用
sbt +compile会自动遍历所有声明的crossScalaVersions,分别构建对应的子项目集合。
内容的提问来源于stack exchange,提问作者shadow chris
相关产品推荐
相关产品推荐

