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

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

4b9b3361

Ответ 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>