【问题标题】:Shading over third party classes遮蔽第三方类
【发布时间】: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


    【解决方案1】:

    原来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 描述了这个问题以及导致它的过程,供任何有兴趣更深入解释的人使用。

    【讨论】:

    • 是否有展示此错误修复的示例项目?
    • @sparkr 不,但您可以使用sbt-assembly 0.14.2 轻松复制它。
    • 您介意看看我面临的问题吗?这是 Stackoverflow 帖子的链接:stackoverflow.com/questions/43988025/…
    • 你有一个 GitHub 项目来展示如何正确创建 build.sbt 吗?
    • @sparkr 用于着色?
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多