Конфликт версии slf4j при построении с Maven
Я понял, что один из моих проектов использует slf4j 1.5.8, а Hibernate использует slf4j 1.6. При создании с Maven он загружает обе банки, но я думаю, что файлы классов 1.5.8 используются. Итак, когда я запускаю программу, я получаю следующую ошибку:
SLF4J: The requested version 1.5.8 by your slf4j binding is not compatible with [1.6]
В pom.xml
я положил
<dependencyManagement>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
</dependencyManagement>
1.5.8 является частью зависимости, поэтому он загружается сам по себе.
Ответы
Ответ 1
Как вы обнаружили, есть две библиотеки (Hibernate и некоторые другие), транзитивно импортирующие SLF4J в двух разных версиях. К сожалению, старая версия подхвачена maven (есть некоторые правила, которые в этой ситуации должны быть выбраны maven в этой ситуации). Решение состоит в том, чтобы добавить exclusion
в зависимость, которая импортирует более старую версию SLF4J (com.example:foo-bar
здесь пример):
<dependency>
<groupId>com.example</groupId>
<artifactId>foo-bar</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Если вы все еще испытываете эту проблему, выполните:
$ mvn dependency:tree
Ищите версию 1.5.8 и исключите ее из всех импортирующих ее библиотек.
Ответ 2
Исключение совершенно не нужно и, возможно, довольно вводит в заблуждение. Вместо этого явно включает slf4j-api с желаемой версией в ваших проектах pom файла. Что это!
Этот подход использует правила транзитивности Maven: выигрывает самое ближайшее объявление зависимости.
Ответ 3
вы можете исключить неверную версию примерно так:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.7.ga</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>