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

Зависимость от 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 обрабатывает управление версиями по какой-то стратегии по умолчанию? Что это за стратегия по умолчанию?

4b9b3361

Ответ 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, чтобы узнать, какие артефакты - вместе с полной информацией об артефактах, включая номера версий - разрешены в результате управления зависимостями.