Зависимость от maven без версии
Недавно я работал над некоторыми улучшениями в проекте, разработанном некоторое время назад, и вот что я нашел. Множество зависимостей в pom файлах не имеют указанных версий, но они разрешены. Проект состоит из 1 корневого модуля и 2 подмодулей. Используется шаблон Aggregator, означающий, что в нем вообще отсутствует раздел dependencyManagement. Верхний проект просто объединяет 2 модуля и все это делает. Подпроекты не относятся к нему как к родителю. У них другой родитель. Чего я не могу понять, так это того, что ни сами подпроекты, ни их родительские объекты (на самом деле, они также не имеют зависимостей) не определяют версии для некоторых зависимостей. Например:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>imap</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
Может кто-нибудь помочь мне понять это? Maven обрабатывает управление версиями по какой-то стратегии по умолчанию? Что это за стратегия по умолчанию?
Ответы
Ответ 1
Ладно, думаю, я сам на это отвечу. Конечно, я взглянул на зависимости: дерево, но все упомянутые мной зависимости были членами дерева первого уровня. Что я не сразу заметил, так это то, что dependencyManagement
отсутствует в родительском объекте, но, тем не менее, присутствует в подмодулях, и что более интересно, он содержит:
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>1.0.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Я никогда не использовал Spring IO Platform раньше, так что это абсолютно новая концепция для меня. Как оказалось, платформа включает в себя довольно много предварительно настроенных зависимостей: http://docs.spring.io/platform/docs/current/reference/htmlsingle/#appendix-dependency-versions
Ответ 2
Невозможно, чтобы maven работал без определения версий артефактов. Они должны быть определены где-то в теге dependencyManagement либо в подмодуле, либо в родительском. Проверьте свою иерархию pom. Используйте mvn help:effective-pom
в каталоге подмодулей проекта. Также вы можете использовать mvn dependency:tree
, чтобы узнать, какие артефакты - вместе с полной информацией об артефактах, включая номера версий - разрешены в результате управления зависимостями.