Затенение над сторонними классами

В настоящее время я сталкиваюсь с проблемой развертывания uber-jar в приложении Spark Streaming, где есть конгруэнтные JAR с разными версиями, из-за которых искра генерирует исключения во время выполнения. Речь идет о библиотеке TypeSafe Config.

После многих попыток мое решение состояло в том, чтобы отложить затенение предоставленной зависимости, чтобы она не конфликтовала с JAR, предоставленным Spark во время выполнения.

Поэтому я обратился к документации по 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-сборку v0.14.1


person Yuval Itzchakov    schedule 04.04.2016    source источник


Ответы (1)


Оказывается, это была ошибка в sbt-assembly, из-за которой затенение было полностью нарушено в Windows. Это привело к удалению исходных файлов из Uber JAR и к сбою тестов, поскольку указанные классы были недоступны.

Я создал запрос на включение, чтобы исправить это . Начиная с версии 0.14.3 SBT функция затенения работает правильно. Все, что вам нужно сделать, это обновить до соответствующей версии в 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/

Изменить

Я написал сообщение в блоге с описанием проблемы. и процесс, который привел к этому, для всех, кто заинтересован в более подробном объяснении.

person Yuval Itzchakov    schedule 07.04.2016
comment
Есть ли пример проекта, который демонстрирует исправление этой ошибки? - person joesan; 15.05.2017
comment
@sparkr Нет, но вы можете легко воспроизвести его, используя sbt-assembly 0.14.2. - person Yuval Itzchakov; 15.05.2017
comment
Не могли бы вы взглянуть на проблему, с которой я столкнулся? Вот ссылка на сообщение Stackoverflow: stackoverflow.com/questions/43988025/ - person joesan; 15.05.2017
comment
У вас есть проект GitHub, который показывает, как правильно создать build.sbt? - person joesan; 15.05.2017
comment
@sparkr Для затенения? - person Yuval Itzchakov; 15.05.2017
comment
Да для затенения! У вас была возможность изучить вопрос, который я разместил? - person joesan; 15.05.2017
comment
Я делаю sbt publish и хочу упаковать свою зависимость с опубликованным jar-файлом и затенить его. Я пытался добавить assemblyShadeRules, но это не сработало при публикации. Есть идеи? - person Avner Barr; 17.07.2018
comment
@Avner Публикация uber jar в качестве зависимости - это не то, что вам обычно нужно. Вы уверены, что это то, что вы имели в виду? - person Yuval Itzchakov; 17.07.2018
comment
Совсем не уверен. В настоящее время я не публикую банку uber. У потребителя моей банки проблемы, поэтому я думаю, что убер-банка может замаскировать эти проблемы. - person Avner Barr; 18.07.2018
comment
@YuvalItzchakov Может быть, вы можете ответить на этот вопрос или узнать о другом подобном вопросе -and-depe" title="sbt publish или publishlocal против сборки sbt для целей распространения и depe"> stackoverflow.com/questions/51380302/ - person Avner Barr; 18.07.2018