4

sbt-assembly如果有人可以提供帮助,我有一个奇怪的问题

当试图创建胖 jar 以部署到 Spark 并应用到shapeless库的阴影时,我看到一些类在 Ubuntu 机器上运行时没有被重命名,而sbt assembly在 Mac 中运行时一切都被重命名。

这是阴影配置

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("shapeless.**" -> "shadedshapeless.@1")
    .inLibrary("com.chuusai" % "shapeless_2.11" % "2.3.2")
    .inLibrary("com.github.pureconfig" % "pureconfig_2.11" % "0.7.0")
    .inProject)

在 Mac 中运行时,这些类被重命名为模式shapeless/Generic*

Renamed shapeless/Generic$.class -> shadedshapeless/Generic$.class
Renamed shapeless/Generic.class -> shadedshapeless/Generic.class
Renamed shapeless/Generic1$.class -> shadedshapeless/Generic1$.class
Renamed shapeless/Generic1$class.class -> shadedshapeless/Generic1$class.class
Renamed shapeless/Generic1.class -> shadedshapeless/Generic1.class
Renamed shapeless/Generic10$class.class -> shadedshapeless/Generic10$class.class
Renamed shapeless/Generic10.class -> shadedshapeless/Generic10.class
Renamed shapeless/Generic1Macros$$anonfun$1.class -> shadedshapeless/Generic1Macros$$anonfun$1.class
Renamed shapeless/Generic1Macros$$anonfun$2.class -> shadedshapeless/Generic1Macros$$anonfun$2.class
Renamed shapeless/Generic1Macros.class -> shadedshapeless/Generic1Macros.class
Renamed shapeless/GenericMacros$$anonfun$23.class -> shadedshapeless/GenericMacros$$anonfun$23.class
Renamed shapeless/GenericMacros.class -> shadedshapeless/GenericMacros.class

但是当在 Ubuntu 中运行时,对于模式shapless/Generic*只有这些东西被重命名

Renamed shapeless/GenericMacros$$anonfun$23.class -> shadedshapeless/GenericMacros$$anonfun$23.class
Renamed shapeless/Generic1Macros$$anonfun$1.class -> shadedshapeless/Generic1Macros$$anonfun$1.class
Renamed shapeless/Generic1$.class -> shadedshapeless/Generic1$.class
Renamed shapeless/Generic1.class -> shadedshapeless/Generic1.class

shapeless/Generic*我在提供 fat jar(在 Ubuntu 中生成)时选择了模式,spark-submit然后立即收到错误(可能来自pureconfig

Exception in thread "main" java.lang.NoClassDefFoundError: shadedshapeless/Generic

将Mac生产的脂肪罐送入时不会发生错误spark-submit

4

1 回答 1

0

我不确定为什么在 Ubuntu 上着色的工作方式与 MacO 不同,但我看到的一个问题是你只对无形的一部分进行着色。我认为这不是一个好主意,并且会给你带来问题,因为你会混合不同版本的 shapeless。我的建议是尝试完全为 PureConfig 着色。只需添加

assemblyShadeRules in assembly := Seq(ShadeRule.rename("shapeless.**" -> "new_shapeless.@1").inAll)

到你的 sbt 文件。我在 Ubuntu 16.04 上使用 PureConfig 7.2 和 Spark 2.1.0 测试了这个解决方案。有关此问题,请参阅PureConfig 的常见问题解答部分

于 2017-06-21T20:28:10.800 回答