Ошибка затенения sbt-сборки с бесформенным в Ubuntu

У меня странная проблема с sbt-assembly если кто-нибудь может помочь

При попытке создать толстую банку для развертывания в 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* потому что когда я предоставляю банку с жиром (производится в Ubuntu) spark-submit то сразу получаю ошибку pureconfig)

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

При подаче на Mac толстой банки, произведенной в Mac, ошибки не возникаетspark-submit

1 ответ

Я не уверен, почему в Ubuntu затенение работает не так, как в MacO, но я вижу одну проблему: вы затеняете только часть бесформенного. Я не думаю, что это хорошая идея и может вызвать проблемы, потому что вы будете смешивать разные версии бесформенных. Мое предложение состоит в том, чтобы попробовать затенение бесформенного полностью для PureConfig. Просто добавь

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

в ваш файл SBT. Это решение было протестировано мной на Ubuntu 16.04 с PureConfig 7.2 и Spark 2.1.0. См. Раздел часто задаваемых вопросов PureConfig об этой проблеме.

Другие вопросы по тегам