В чем разница между dependencyManagement и dependencies

 
 
 
Сообщения:12
Всем привет

Объясните пожалуйста в чем разница между ними, ни как не могу понять.

Например есть проект состоящий из модулей:
Parent
Child1
Child2
Child3



Насколько я вычитал если в родительском(Parent POM файле) объявляю секцию вида:
 <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>


То все дочерние модули Child1, Child2, Child3 автоматически наследуют эту зависимость(в них эту зависимость прописывать не нужно будет). Если же в каком-то модуле мне нужна будет какая-то дополнительная зависимость, то я ее пропишу лишь в том модуле где она мне нужна.


По поводу dependencyManagement вычитал, что она автоматически зависимости не добавляет и их нужно прописывать самому в каждом модуле:
Т.е. если я в Parent POM пропишу:
<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
        </dependency>
    </dependencies>
</dependencyManagement>


То в каждом из модулей Child1, Child2, Child3 мне придется ее прописывать самому:
    <dependencies>
        <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        </dependency>
    </dependencies>


Т.е. dependencies делается все автоматически а в dependencyManagement все нужно прописывать вручную, какая тогда от него польза?
 
 
Сообщения:10002
dependencyManagement описывает зависимость, но не добавляет ее. Соответственно мы в нем можем описать настройки (в едином месте), а затем уже в тех подмодулях где зависимость нужна - там ее и подключать (не дублируя настройки). Если же зависимость нужна абсолютно в каждом child module, то ее можно сразу в dependencies описать.

Также dependencyManagement позволяет переопределять версию транзитивных зависимостей. При этом если мы проапргрейдимся на новую версию библиотеки и ее транзитивная зависимость исчезнет, то и из classpath'a она тоже пропадет. А если б мы ее в dependencies описали - она бы осталась, хотя больше нигде не используется.
 
 
Сообщения:12
Т.е. если я правильно понял можно привести такой пример:

Parent POM
Child1
Child2
Child3
Child4
Child5

мы хотим использовать зависимость "зав1" во всех модулях поэтому в файле Parent POM пишем:
<dependencies>
<dependency>
<groupId>зав1</groupId>
<artifactId>зав1</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

А зависимость зав2 мы хотим использовать лишь в модулях(Child2, Child4), если мы ее пропишем в dependency она попадет и в (Child1, Child3, Child5). И чтобы этого избежать нужно использовать <dependencyManagement> и прописать ее потом лишь в Child2, Child4.

Правильно я понял?
 
 
Сообщения:10002
Да
 
 
Сообщения:12
Староверъ:
Да
спасибо за разъяснение, теперь все понятно.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет