我正在尝试使用 SBT 构建我的 Scala 源代码,目标是相同Scala 版本,但库版本不同。我的问题是:
详情: 我正在使用不同版本的 Spark 和其他库构建集群。这似乎是这种场景中的常见用户案例。
我找到的可能解决方案:
没有 sbt 不支持这一点,但如果你想这样做,那么你可以使用着色。 就像如果我想使用由两个不同库支持的两个不同版本的番石榴,然后使用番石榴着色,例如:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.google.guava**" -> "shadeio.@1").inAll
)
我解决了这个问题,为不同的 Apache Spark 版本构建 Spark PDF 数据源。
您可以在此处查看示例。
我还为每个版本的 Spark 构建了一些自定义代码:
val sparkVersion = scala.util.Properties.envOrElse("SPARK_VERSION", "3.5.0")
val packageName =
sparkVersion match {
case sparkVersion if sparkVersion.startsWith("3.3") => "spark-pdf-spark33"
case sparkVersion if sparkVersion.startsWith("3.4") => "spark-pdf-spark34"
case _ => "spark-pdf-spark35"
}
lazy val common = (project in file("common"))
.settings(
name := "common",
commonSettings
)
.disablePlugins(AssemblyPlugin)
lazy val spark35 = (project in file("spark35"))
.settings(
name := "spark35",
commonSettings,
)
.disablePlugins(AssemblyPlugin)
.dependsOn(common)
lazy val spark34 = (project in file("spark34"))
.settings(
name := "spark34",
commonSettings,
)
.disablePlugins(AssemblyPlugin)
.dependsOn(common)
lazy val spark33 = (project in file("spark33"))
.settings(
name := "spark33",
commonSettings,
)
.disablePlugins(AssemblyPlugin)
.dependsOn(common)
lazy val root = (project in file("."))
.settings(
name := packageName,
commonSettings,
)
.dependsOn(dependencyModules():_*)
.aggregate(aggregatedModules(): _*)