DependencyManagement в родительском игнорируется

У меня есть проект P1, который создает банку. Этот проект имеет родительский POM, P1-PARENT. P1-Parent включает в себя следующее:

<dependencyManagement>
    <!-- Kafka uses Zookeeper 3.3.4, but Curator requires 3.4.5. To resolve
         we specify 3.4.5 so all projects using either Kafka or Curator will
         get the later version which is compatible with both projects. -->
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka_2.10</artifactId>
      <version>0.8.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-client</artifactId>
      <version>2.2.0-incubating</version>
    </dependency>
    <!-- A bunch of other irrelevant stuff here -->
</dependencyManagement>

Это работает - вывод "mvn dependency: tree" включает в себя:

[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.0:compile
[INFO] |  +- org.apache.zookeeper:zookeeper:jar:3.4.5:compile (version managed from 3.3.4)

Обратите внимание, что это единственная зависимость от zookeeper (проверяется через "mvn dependency: tree | grep zoo".

У меня есть несколько других проектов, которые также наследуются от P1-PARENT, и все работает нормально, все они тянут ZooKeeper 3.4.5. Тем не менее, мой коллега недавно начал использовать P1 в одном из своих проектов. Их проект не наследуется от P1-PARENT. Транзитивная зависимость, получаемая от P1, - ZooKeeper 3.3.4, а не 3.4.5. Мы проверили через "mvn dependency: tree", что они получают zookeeper.3.3.4 в качестве транзитивной зависимости Kafka (например, результат выглядит идентично тому, что я вставил выше, но версия 3.3.4, и это не так 't включить бит "(версия управляется..." ).Кроме того, как и мои проекты, единственная зависимость, которую они имеют от ZooKeeper (транзитивная или иначе), находится через P1 (проверяется зависимостью: tree и grep). Вопрос в том, почему. Когда они включают P1, не следует ли maven смотреть на родительский POM P1 при определении транзитивных зависимостей P1?

Я использую Maven 3.0.5. Они используют версии 3.0.3 и 3.1.1 и видят проблему с обеих этих версий.

Ответ 1

В этом случае Maven не разрешает проблему транзитивной зависимости версии.

Эта проблема может быть использована с использованием концепции maven bom.

Проверьте документацию maven для bom в приведенной ниже ссылке http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

Вот еще один блог, в котором объясняется использование http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/

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

Ответ 2

При использовании Maven3 убедитесь, что вы используете правильную версию maven-dependency-plugin, вызвав ее по ее полному имени: org.apache.maven.plugins:maven-dependency-plugin:2.8:tree. IIRC до 2.6 дал неправильное дерево. В таких случаях совет заключался в следующем: запустите свой проект как "mvn validate -X", чтобы увидеть дерево, разрешенное Aether, структуру управления зависимостями для Maven.