Может ли SBT переопределить транзитивную зависимость с помощью другой библиотеки? - PullRequest
0 голосов
/ 05 августа 2020

Специфический вариант использования c касается сторонних библиотек, которые зависят от более старого log4j 1.x, например log4j:log4j:1.2.17, который несколько лет находится в состоянии EOL, а go. Apache предоставляет более новую библиотеку log4j 2.x, например org.apache.logging.log4j:log4j-1.2-api:2.13.3. Я понимаю, что могу использовать excludeDependencies, чтобы опустить log4j:log4j, или dependencyOverrides, чтобы изменить версию зависимости. Поскольку org.apache.logging.log4j:log4j-1.2-api:2.13.3 предоставляется для реализации API log4j 1.x, я надеюсь, что смогу написать правило «как»:

SBT: если для log4j:log4j:1.2.17 обнаружена транзитивная зависимость, вместо этого введите org.apache.logging.log4j:log4j-1.2-api:2.13.3

1 Ответ

0 голосов
/ 06 августа 2020

Технически это можно сделать, причем несколькими способами. Например, вы можете добавить в свой sbt:

libraryDependencies ++= Seq(
  "org.apache" %% "dependecy-name" % "version" exclude("org.slf4j","slf4j-log4j12")
  "org.slf4j" %% "slf4j-log4j12" % "other-version"
)

Эти строки укажут SBT не добавлять slf4j-log4j12, как это требуется dependecy-name, и позже он будет получен в other-version.

Сказав это, мы должны понимать риск, связанный с этим. Обычно, когда библиотека добавляет зависимость, она использует ее функции в определенной версии. Когда вы решите переопределить версию этой зависимости, возможно, что ваш код не будет компилироваться или, что еще хуже, он будет работать и приведет к другим результатам, чем вы ожидаете. Если вы уверены, что две версии имеют одинаковую функциональность, вы можете это сделать.

Обновление: чтобы удалить зависимость, вы можете добавить в свой build.sbt:

libraryDependencies ~= { _ map {
  case m if m.organization.contains("org") =>
    m.exclude("log4j", "log4j")
  case f => f
}}

Это будет go по всем вашим зависимостям, и каждая из них, которая содержит org в своей организации, будет исключать log4j. Обратите внимание, что это будет иметь силу только для зависимостей верхнего уровня в вашем libraryDependencies.

...