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

Интерпретация "опущена для конфликта" в дереве зависимостей maven 2

Это дерево зависимостей, сгенерированное Maven 2.2.1, с mvn -o dependency:tree -Dverbose -Dincludes=log4j

[INFO] [dependency:tree {execution: default-cli}]
[INFO] com.openboxes.renderingservice:common:jar:1.0
[INFO] +- org.springframework:spring:jar:2.0.4:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1:compile
[INFO] |     \- log4j:log4j:jar:1.2.12:compile
[INFO] \- it.mycompany.portal:server:jar:1.5-SNAPSHOT:compile
[INFO]    \- org.slf4j:slf4j-log4j12:jar:1.1.0:compile
[INFO]       \- (log4j:log4j:jar:1.2.13:compile - omitted for conflict with 1.2.12)

Как вы можете видеть, log4j v1.2.12 является предпочтительным по сравнению с v1.2.13.

Я знаю, что "Maven разрешает конфликты версий с стратегией ближайших побед" (см. http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html), но эти две зависимости кажутся на том же расстоянии (два уровня вложенности, я не прав?), поэтому я ожидаю, что используется последний.

Может кто-нибудь объяснить этот результат?

Да, log4j явно не объявлен в этом POM (и я думаю, что это должно быть), но я хотел бы лучше понять, как работает Maven.

спасибо

4b9b3361

Ответ 1

Я нашел ответ самостоятельно в http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html: "если две версии зависимостей находятся на одной глубине в дереве зависимостей, пока Maven 2.0.8 не было определено, какой из них выиграть, но поскольку Maven 2.0.9 это порядок в объявлении, который считается: первое объявление выигрывает".

Мне кажется очень сомнительной стратегией.: -\

Ответ 2

если две версии зависимостей находятся в одной и той же глубине в дереве зависимостей или если они не находятся на одной и той же глубине, которая является более близкой к проекту, будет указана на Проект.

Есть два решения, чтобы решить это, когда вы знаете глубину вашей зависимости.

Во-первых: если эти зависимости включены как часть другого проекта в библиотеку, вы можете удалить их вручную, но вы не хотите, чтобы ваш проект указывал на эту зависимость, как это было из-за близости к вашему проекту. Вы можете исключить jar конкретного проекта, как показано ниже в вашем проекте pom.xml

 <dependency>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit</artifactId>
        <version>3.1.3.2</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Второй: Вы напрямую добавляете jar ожидаемой версии в pom.xml вашего проекта. Тогда это будет ближайшая банка к вашему проекту.

Используя оба упомянутых выше способа, вы можете решить проблему.