Hibernate-аннотации 3.4.0.GA и slf4j? - PullRequest
       21

Hibernate-аннотации 3.4.0.GA и slf4j?

4 голосов
/ 23 августа 2010

У меня есть проект A maven, использующий hibernate-annotations 3.4.0.GA, который использует версию 1.5.5 slf4j-api (проверено с помощью дерева зависимостей в файле pom.xml).Дальнейший проект A определяет slf4j-log4j12 версии 1.4.2 в качестве зависимости.

У меня есть другой проект maven B, который зависит от проекта A. В проекте BI определены следующие зависимости:

slf4j-api version 1.6.1,
logback-core version 0.9.24
logback-classic version 0.9.24

который прекрасно работает с Maven из командной строки.Но когда я запускаю проект из конфигурации запуска eclipse, я получаю:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/mm/.m2/repository/org/slf4j/slf4j-log4j12/1.4.2/slf4j-log4j12-1.4.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/mm/.m2/repository/ch/qos/logback/logback-classic/0.9.24/logback-classic-0.9.24.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: slf4j-api 1.6.x (or later) is incompatible with this binding.
SLF4J: Your binding is version 1.5.5 or earlier.
SLF4J: Upgrade your binding to version 1.6.x. or 2.0.x

Из этого сообщения указывается, что мне нужно обновить привязку в проекте A до 1.6.x, но я не вижу, какэто возможно, поскольку он включен в зависимость hibernate.

Возможно ли переключить привязку (обновление информации о пути к классам) при запуске проекта B, чтобы он использовал версию 1.6.1 вместо версии из проекта hibernate

Ответы [ 2 ]

9 голосов
/ 23 августа 2010

У меня есть проект A maven, который использует hibernate-annotations 3.4.0.GA, который использует версию 1.5.5 slf4j-api (проверено с помощью дерева зависимостей в файле pom.xml).Дальнейший проект A определяет slf4j-log4j12 версии 1.4.2 в качестве зависимости.

Это не рекомендуется, вы должны использовать те же версии артефактов slf4j.Из FAQ:

Версии SLF4J обратно совместимы?

За редкими теоретическими исключениями, версии SLF4J обратно совместимы.Это означает, что вы можете без проблем обновить SLF4J версии 1.0 до любой более поздней версии.

Однако, хотя API SLF4J очень стабилен с точки зрения клиента, для привязок SLF4J, таких как slf4j-simple или slf4j-log4j12, может потребоватьсяконкретная версия slf4j-api. Смешивание разных версий артефактов slf4j может быть проблематичным и настоятельно не рекомендуется. Например, если вы используете slf4j-api-1.5.6.jar, вам также следует использовать slf4j-simple-1.5.6.jar, использование slf4j-simple-1.4.2.jar не будет работать.

Во время инициализации, если SLF4J подозревает, что может быть проблема несоответствия версий, он выдает предупреждение об указанном несоответствии.Точную информацию о механизме обнаружения несоответствия версий можно найти в соответствующей записи в этом FAQ.

Это что-то, чтобы исправить.

который прекрасно работает с Maven из командной строки.Но когда я запускаю проект из конфигурации запуска eclipse, я получаю (...)

Проблема в том, что вы получаете артефакты SLF4J от B и от A (транзитивно)и таким образом вы в конечном итоге смешаете несколько версий slf4j-api (1.5.5 и 1.6.1) и несколько привязок (slf4j-log4j12 и logback-classic).SLF4J жалуется на более позднюю проблему во время выполнения, но вы должны исправить оба.

Из этого сообщения указывается, что мне нужно обновить привязку в проекте A до 1.6.x, но я непосмотрите, как это возможно, поскольку оно включено в зависимость от режима гибернации.

Да, в сообщении предлагается обновить привязку к более поздней версии.Но, что более важно, он сообщает, что у вас есть более чем ONE привязка к пути к классу: вам нужно выбрать между log4j и logback в качестве поддерживаемой регистрации и обеспечить соответствующую привязку, но не обе из них.

Можно ли переключить привязку (обновить информацию о пути к классам) при запуске проекта B, чтобы он использовал версию 1.6.1 вместо версии из проекта hibernate?

Чтобы строго ответить на этот вопрос об управлении версиями в транзитивных зависимостях, это можно сделать с помощью элемента dependencyManagement.Вот пример:

<project>
  ...
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.1</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  ...
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>3.4.0.GA</version>
    </dependency>
  </dependencies>
  ...
</project>

И артефакты, имеющие slf4j-api в качестве зависимости, например Hibernate EntityManager, будут использовать версию 1.6.1, как показано ниже:

$ mvn dependency:tree
...
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  \- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  \- javassist:javassist:jar:3.4.GA:compile

Но как яСказано, что реальная проблема заключается в том, что вам нужно иметь только одну привязку на пути к классам.Либо выберите log4j или logback, но не оба, и предоставьте соответствующую привязку.

0 голосов
/ 06 июля 2012

У меня была эта проблема, но после сканирования моего дерева зависимостей и исправления pom у меня все еще были проблемы. Мое решение?

mvn clean

(на всякий случай, если кто-то еще допустил мою ошибку!)

...