В настоящее время я сталкиваюсь с проблемой развертывания 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