2014-11-17 4 views
2

Я указал версию библиотеки в импортированном разделе dependencyManagement родительского пом. Я подтвердил, что у моей эффективной жопы есть только одно появление этой зависимости. Он находится в зависимости от раздела управления:Включает ли раздел управления зависимостью maven?

<dependencyManagement> 
    <dependency> 
     <groupId>org.javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>[3.18.1-GA]</version> 
    </dependency> 
</dependencyManagement> 

Это должно переопределить версию для транзитивных зависимостей в зависимости от нее. После установки (и переустановки зависимостей, чтобы соответствовать версии границ), org.apache.maven.plugins: Maven-зависимость-плагин: 2.8: дерево отпечатков:

org.javassist:javassist:jar:3.18.1-GA:compile (version selected from constraint [3.18.1-GA,3.18.1-GA]) 

Но (первоначально, без переустановки зависимостей) силовика жалуется неправильно версия:

[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message: 
Failed while enforcing releasability the error(s) are [ 
Dependency convergence error for org.javassist:javassist:3.18.2-GA paths to dependency are: 
... 

И показывает, что первая транзитивная зависимость использует

org.javassist:javassist:3.18.2-GA 

который исходит от зависимости, которая, в свою очередь, зависит от:

<dependencies> 
    <dependency> 
     <groupId>org.javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.18.2-GA</version> 
    </dependency> 
</dependencies> 

и еще использует

org.javassist:javassist:3.18.1-GA 

Почему силовика несовместимым с деревом зависимостей? Что может быть неправильным? Если я использую ограничения по версиям, будут ли они соблюдаться, и я могу пропустить с помощью средства обеспечения безопасности для этой цели?

Кроме того, добавление зависимости от рассматриваемого модуля проекта ничего не меняет.

ответ

2

Tl; др: dependencyManagement отвергает версию зависимостей переходных

Все кредит за этот ответ идет Энди Денни, чей блог я наткнулся на:
http://andydennie.com/2012/08/02/maven-enforcer-plugin-vs-dependencymanagement/

dependencyManagement делает две вещи - один из которых хорошо известен, а другой редко упоминается.

  1. Установите версию по умолчанию для зависимостей в подмодулях/ребенок проецирует
  2. Переопределить версию переходных зависимостей

Так силовик плагин не игнорировать dependencyManagement. Но не может распознать расхождение, так как версия транзитивной зависимости была изменена до того, как она перешла на работу. Энди Denny имеет хорошее предложение на своем блоге о том, как действовать:

  1. Я не ставлю зависимостей в разделе dependencyManagement моего верхнего уровня РОМ. Я хочу, чтобы меня предупреждал maven-enforcer-plugin, когда у меня возникли несоответствия. Вместо этого я использую свойства версии, как указано в моем подходе № 1 выше.
  2. Когда maven-enforcer-plugin уведомляет меня о несоответствиях, я пытаюсь выяснить, могу ли я использовать артефакты для использования той же версии расходящейся зависимости. Если все связанные зависимости находятся в моих собственных артефактах, я пытаюсь привести их в соответствие с той же версией зависимости.Если некоторые артефакты принадлежат мне, а некоторые из сторонних сторон, я пытаюсь согласовать свои зависимости с третьими сторонами и/или искать другие версии артефактов сторонних разработчиков, которые имеют версии зависимостей, которые выравниваются друг с другом, и мой код.
  3. Если после выполнения вышеизложенного у меня все еще есть неразрешимые расхождения, я выбираю то, что, по моему мнению, является наилучшей версией проблемного артефакта, и указываю, что в разделе pluginManagement проекта POM, где maven-enforcer-plugin сообщил о том, проблема (не в моем POM верхнего уровня). Я добавляю комментарий к объявлению зависимости в том, что POM отмечает проблему и обходной путь, так что в будущем, если я должен перейти на более новую версию зависимости, я увижу заметку и могу вернуться, может ли это несоответствие быть разрешенным.

Компромисс здесь является то, что у вас есть рабочий плагин, который занимающаяся принудительного помогает вам ад зависимостей, но должны делать больше вручную.

Смежные вопросы