通过sbt参数实现scala代码编译控制

因为我们基于spark的数据平台需要针对不同的spark版本进行代码的兼容,和项目构建的方便。需要通过使用sbt构建项目时通过指定spark版本来构建依赖不同spark版本的代码。
首先,我们将不兼容的项目代码分别放到不同的目录下,目录结构如下:
image

然后,通过不同指定不同的spark版本编译不同的兼容代码即可,具体sbt配置如下:

val sparkV = "2.3.0"

lazy val youProject = (project in file("."))
  .settings(commonSettings)
  .settings(
    name := "youProject",
    unmanagedSourceDirectories in Compile += (baseDirectory / s"src/spark-${sparkV}/scala").value,
    ...
    )

通过上面的sbt配置就可以实现对于不同的spark依赖版本,编译项目时就可以使用对应兼容代码进行项目的构建。
但是还是有一些麻烦,每次编译不同的spark依赖版本,都需要手动修改build.sbt文件,还是比较鸡肋。要是可以通过sbt命令传递spark版本参数来控制编译代码,这样就完美了。
我们也是这么想的,也是这么做的。废话少说,看代码

val sparkV = sys.props.getOrElse("spark.version", "2.3.0")

只需要修改一行代码就可以了,编译命令如下:

sbt -Dspark.version=2.2.0 clean assembly

编译时,多了-Dspark.version=2.2.0参数,-D会将spark.version=2.2.0设置为环境变量,在sbt构建过程中就可以获取到该环境变量实现对构建过程的动态控制。
注意:-Dspark.version=2.2.0在task之前,如果在之后则不会起作用。

猜你喜欢

转载自blog.csdn.net/Shie_3/article/details/80657662
sbt