Sbt-сборка: применение shaderule к одной и той же зависимости дважды не работает - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть проект 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-файла в первую очередь, мы можем иметь преимущество в этих случаях, все еще полагаясь на предоставленные кластером зависимости.

Проблемы:

  1. Я не могу заштриховать все, потому что если Avro затеняется в D , тогда переопределенные классы больше не будут совместимы с классами в кластере
  2. Затенение 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 и снова вызвать затенение после первой?

...