Подтвердить что ты не робот

"необязательная" зависимость с областью "предоставляется" в Maven

Maven иногда немного по голове... Я создал библиотеку, которая имеет необязательную зависимость от slf4j и log4j. По необязательным значениям я имею в виду:

  • Моя библиотека нуждается в тех фреймворках регистрации во время компиляции
  • Моя библиотека не нуждается в них во время выполнения, но если она "обнаруживает" их, они будут использовать их

В настоящее время я отметил эту зависимость как "необязательную" и "предоставленную":

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
    <type>jar</type>
    <scope>provided</scope>
    <optional>true</optional>
</dependency>

Но некоторые из моих пользователей сообщили о проблемах, потому что им не нужен log4/slf4j. Правильно ли моя зависимость? К сожалению, я считаю официальную документацию слишком абстрактной, чтобы понять эту проблему.

4b9b3361

Ответ 1

Вы проверили эту документацию. Он описывает ваш прецедент очень хорошо. Маркировка зависимостей как необязательная не будет разрешать их как транзитивные зависимости в приложении, использующем вашу библиотеку (даже если область compile).

В отличие от <scope>provided</scope>, который используется для требуемых зависимостей, которые будут предоставляться средой выполнения, зависимость <optional>true</optional> необязательно должна быть обязательной (идея состоит в том, что некоторые из зависимостей используются только для определенных функций в проекте и не понадобится, если эта функция не используется.).

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

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