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.