У меня есть проект Spark P , в котором я хотел бы затенить Avro. Это можно легко определить с помощью sbt-assembly (v0.14.10):
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.apache.avro.**" -> "shaded.@0").inAll
)
}
Однако P имеет зависимость D , в которой я хочу сохранить оригинальное наименование пакета Avro, без затенения.
Причина в том, что D содержит копии классов, которые принадлежат некоторым зависимостям, предоставляемым кластером (например, Spark, Hive). Цель состоит в том, чтобы переопределить некоторые классы (не вызываемые из пользовательского кода) исправлениями ошибок; так как классы загружаются из развернутого жирного jar-файла в первую очередь, мы можем иметь преимущество в этих случаях, все еще полагаясь на предоставленные кластером зависимости.
Проблемы:
- Я не могу заштриховать все, потому что если Avro затеняется в D , тогда переопределенные классы больше не будут совместимы с классами в кластере
- Затенение D в своем собственном проекте и "неэкранирование" (возвращаясь к исходному имени пакета) он в assemblyShadeRules работает нормально , но тогда интеграционные тесты в P не пройдут перед сборкой, так как они ожидают незатененную версию Avro:
Например:
Проект D:
assemblyShadeRules in assembly := Seq(ShadeRule.rename("org.apache.avro.**" -> "unshade.@1").inAll
Проект P:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.apache.avro.**" -> "shaded.@1").inAll,
ShadeRule.rename("unshade.**" -> "org.apache.avro.@1").inLibrary(
"com.myproject.d" % "myproject-d" % "1.0").inProject
)
}
(желаемое решение) Когда я сначала «делаю резервную копию»
D , а затем восстанавливаю ее после затенения остальных, это не работает вообще, независимо от того, как и какую комбинацию я использую (inProject, inLibrary, inAll):
Проект D: нет правила затенения
Проект P:
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("org.apache.avro.**" -> "unshade.@1").inLibrary(
"com.myproject.d" % "myproject-d" % "1.0").inProject
),
ShadeRule.rename("org.apache.avro.**" -> "shaded.@1").inAll,
ShadeRule.rename("unshade.**" -> "org.apache.avro.@1").inLibrary(
"com.myproject.d" % "myproject-d" % "1.0").inProject
),
}
Похоже, что затенение данной зависимости может быть выполнено только Однажды в AssemblyShadeRules, нет никакого способа изменить его, как: оригинал -> резервное копирование -> оригинал.
Я что-то упустил? Есть ли способ обойти это, например, определить задачу постобработки в sbt и снова вызвать затенение после первой?