Я нахожусь в процессе рефакторинга веб-приложения Java, которое имеет довольно большое количество зависимостей. Я хотел бы использовать slf4j
, с log4j2
в качестве базовой реализации ведения журнала. Тем не менее, приложение включает в себя некоторые зависимости Spring. Spring использует JCL (Jakarta common logging) для своей регистрации, поэтому он вводит commons-logging
в качестве транзитивной зависимости. Это потенциальная проблема, потому что это означает, что slf4j
может выбрать jcl
в качестве реализации ведения журнала, и что Spring может войти где-то нежелательным образом.
Из документации slf4j решение состоит в том, чтобы сначала отключить commons-logging
, исключив его из POM, а затем использовать jcl-over-slf4j
для замены commons-logging
. Конечно, jcl-over-slf4j
перенаправит все предыдущие вызовы журнала, сделанные Spring, на slf4j
.
Я пытался исключить commons-logging
, например,
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
Однако, при проверке дерева зависимостей Maven, commons-logging
все равно теперь обнаруживается как зависимость json-lib
, еще одна зависимость, которая есть у проекта.
Быстро стало ясно, что ручное исключение всех нежелательных зависимостей журналирования не будет хорошо масштабироваться. Далее в документации slf4j
предлагается использовать область действия, предоставляемую в качестве опции:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>provided</scope>
</dependency>
Однако, как обсуждает этот вопрос SO , этот подход по-прежнему означает, что другие структуры ведения журналов будут присутствовать во время тестирования. Кроме того, мне не ясно, будет ли этот предоставленный параметр применяться к всем версиям commons-logging
, или для каждой версии потребуется определенная запись. Если последнее так, то это было бы так же утомительно, как просто исключить commons-logging
везде.
Как лучше всего исключать нежелательные зависимости ведения журнала для настройки slf4j
в приложении Java?