【发布时间】:2016-07-24 05:40:33
【问题描述】:
我目前在将 uber-jar 部署到 Spark Streaming 应用程序时遇到问题,其中存在具有不同版本的一致 JAR,这会导致 spark 引发运行时异常。有问题的图书馆是TypeSafe Config。
在尝试了很多事情之后,我的解决方案是推迟对提供的依赖项进行着色,这样它就不会与 Spark 在运行时提供的 JAR 冲突。
因此,我去了sbt-assembly 的文档,在阴影下,我看到了以下示例:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.apache.commons.io.**" -> "shadeio.@1")
.inLibrary("commons-io" % "commons-io" % "2.4", ...).inProject
)
试图遮蔽com.typesafe.config,我尝试将以下解决方案应用于我的build.sbt:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.typesafe.config.**" -> "shadeio.@1").inProject
)
我认为它应该在我的项目中重命名对 TypeSafe Config 的任何引用。但是,这行不通。它匹配我项目中的多个类,并导致它们从 uber jar 中删除。我在尝试运行 sbt assembly 时看到了这一点:
Fully-qualified classname does not match jar entry:
jar entry: ***/Identifier.class
class name: **/Identifier.class
Omitting ***/OtherIdentifier.class.
Fully-qualified classname does not match jar entry:
jar entry: ***\SparkBaseJobRunner$$anonfun$1.class
class name: ***/SparkBaseJobRunner$$anonfun$1.class
我也尝试过使用:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.typesafe.config.**" -> "shadeio.@1")
.inLibrary("com.typesafe" % "config" % "1.3.0")
这确实完成了 uber JAR 的组装过程,但没有达到预期的运行时效果。
我不确定我是否完全理解阴影对我使用 sbt 的构建过程的影响。
如何在我的项目中遮蔽对com.typesafe.config 的引用,这样当我在运行时调用库时,Spark 将加载我的遮蔽库并避免由版本控制引起的冲突?
我正在运行 sbt-assembly v0.14.1
【问题讨论】:
标签: scala sbt sbt-assembly