Scala多项目架构中如何在build.sbt导入项目文件夹下的类?
好问题!这种在多个应用模块的构建脚本(build.sbt)里共享自定义任务逻辑的场景太常见了,完全没必要复制CommonCommand.scala的代码——下面给你几个靠谱的方案:
方案1:将Common模块改造为SBT插件(推荐)
SBT的构建脚本本身运行在独立的类加载环境中,普通业务模块的代码默认不会被加载到这个环境里。把Common改成SBT插件,就能让它的代码被所有子模块的构建脚本访问到:
调整Common模块结构:
把CommonCommand.scala移动到Common/src/main/scala目录下(符合SBT插件的源码结构),然后修改Common/build.sbt,声明这是一个SBT插件:sbtPlugin := true organization := "your.company" name := "common-build-plugin" version := "0.1.0" scalaVersion := "2.12.18" // 注意要和你的SBT版本兼容:SBT 1.x系列对应Scala 2.12在ApplicationA/B中引入插件:
在ApplicationA/project/plugins.sbt和ApplicationB/project/plugins.sbt里添加插件依赖:addSbtPlugin("your.company" % "common-build-plugin" % "0.1.0")之后你就能在ApplicationA/B的
build.sbt里直接导入CommonCommand类,调用它的方法并传递参数了。
方案2:共享构建源码目录(轻量方案)
如果不想做插件,也可以把共享的构建代码放到一个统一目录,让ApplicationA/B的构建系统自动加载这个目录的源码:
创建共享源码目录:
在项目根目录新建shared-build-code文件夹,把CommonCommand.scala移到这里。配置子模块加载共享目录:
在ApplicationA/project/build.sbt(或者新建ApplicationA/project/Build.scala)里添加:unmanagedSourceDirectories in Compile += baseDirectory.value / "../shared-build-code"对ApplicationB做同样的配置。这样SBT在编译构建脚本时,会把这个共享目录当成自己的源码目录,自然就能识别
CommonCommand类了。
方案3:打包构建代码为JAR并添加依赖
这个方案适合临时场景,不过需要手动维护JAR的更新:
打包Common模块的构建代码:
在Common模块执行sbt package,生成包含CommonCommand类的JAR文件。在子模块中引入JAR:
把生成的JAR复制到ApplicationA/project/lib和ApplicationB/project/lib目录下;或者在ApplicationA/project/build.sbt里添加本地依赖:libraryDependencies += "your.company" % "common-build" % "0.1.0" from "file:///path/to/common/target/scala-2.12/common_2.12-0.1.0.jar"
内容的提问来源于stack exchange,提问作者tcafrin22

