У меня есть проект 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 версии 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, но не оба, и предоставьте соответствующую привязку.