遮蔽第三方课程

问题描述 投票:7回答:1

我目前面临着将一个超级jar部署到Spark Streaming应用程序的问题,其中存在具有不同版本的全等JAR,这些JAR导致引发运行时异常的火花。有问题的图书馆是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的任何引用。但是,这不起作用。它匹配我的项目中的多个类,并导致它们从超级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")

这确实完成了超级JAR的组装过程,但没有达到预期的运行时间效果。

我不确定我是否完全理解了着色对我的构建过程的影响与sbt。

如何在项目中对com.typesafe.config的引用进行着色,这样当我在运行时调用库时,Spark会加载我的着色库并避免版本控制引起的冲突?

我正在运行sbt-assembly v0.14.1

scala sbt sbt-assembly
1个回答
12
投票

原来this was a bug in sbt-assembly where shading was completely broken on Windows.这导致源文件从uber JAR中删除,并且由于所述类不可用而导致测试失败。

我创造了一个pull request to fix this。从SBT的0.14.3版开始,阴影功能正常工作。您需要做的就是更新plugins.sbt中的相关版本:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")

要为项目中的特定JAR着色,请执行以下操作:

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("com.typesafe.config.**" -> "my_conf.@1")
    .inLibrary("com.typesafe" % "config" % "1.3.0")
    .inProject
)

这将重命名com.typesafe.config组件包装在my_conf内。然后,您可以在装配体上使用jar -tf查看此内容(为简洁起见,省略了相关部分):

***> jar -tf myassembly.jar
my_conf/
my_conf/impl/
my_conf/parser/

编辑

我写了一篇blog post,描述了这个问题,并为任何对更深入解释感兴趣的人提供了这个过程。

© www.soinside.com 2019 - 2024. All rights reserved.