В чем разница между dependencyManagement
и dependencies
? Я видел документы на веб-сайте Apache Maven. Кажется, что зависимость, определенная в разделе, dependencyManagement
может использоваться в его дочерних модулях без указания версии.
Например:
Родительский проект (Pro-par) определяет зависимость под dependencyManagement
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8</version>
</dependency>
</dependencies>
</dependencyManagement>
Тогда в потомке Pro-par я могу использовать junit:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
Однако мне интересно, нужно ли определять junit в родительском поме? Почему бы не определить его непосредственно в нужном модуле?
<dependencyManagement>
родительском POM. Заключение зависимостей в<dependencyManagement>
централизованное управление версией, областью действия и исключениями для каждой зависимости, если и когда вы решите ее использовать. Руководство Maven по управлению зависимостями раскрывает все детали.dependencyManagement
также управляет переходными зависимостями) верен только в том случае, если зависимости установлены явно: stackoverflow.com/questions/28312975/…dependencies
раздел в вашей родительской помпе. Мы сделали это так, чтобы все дочерние проекты имели по умолчанию некоторые apache-commons и не объявляли их постоянно.Я немного опаздываю на этот вопрос, но думаю, что он заслуживает более четкого ответа, чем принятый (который является правильным, но не подчеркивает фактическую важную часть, которую вы должны определить самостоятельно).
В родительском ПОМ основное различие между
<dependencies>
и<dependencyManagement>
заключается в следующем:Артефакты, указанные в
<dependencies>
разделе, ВСЕГДА будут включены как зависимость дочернего модуля (модулей).Артефакты, указанные в
<dependencyManagement>
разделе, будут включены в дочерний модуль только в том случае, если они также были указаны в<dependencies>
разделе самого дочернего модуля. Почему это хорошо, спросите вы? потому что вы указываете версию и / или область действия в родительском элементе, и вы можете не указывать их при указании зависимостей в дочернем POM. Это может помочь вам использовать унифицированные версии для зависимостей для дочерних модулей без указания версии в каждом дочернем модуле.источник
<dependencyManagement>
over<dependencies>
в корне.pom
? Ребенокpom
может быть намного короче.Artifacts specified in the <dependencies> section will ALWAYS be included as a dependency of the child module(s)
что они также включены в родительский. Кажется, невозможно установить зависимость для детей, но не для родителей.документация на сайте Maven ужасна. То, что делает dependencyManagement, - это просто перемещает ваши определения зависимостей (версия, исключения и т. Д.) В родительский pom, а затем в дочерних poms вы просто должны поместить groupId и artifactId. Вот и все (кроме цепочки родительского pom и тому подобного, но это тоже не сложно) - dependencyManagement побеждает над зависимостями на родительском уровне - но если есть вопрос об этом или об импорте, документация Maven немного лучше).
Прочитав весь мусор 'a', 'b', 'c' на сайте Maven и запутавшись, я переписал их пример. Таким образом, если у вас есть 2 проекта (proj1 и proj2), которые имеют общую зависимость (betaShared), вы можете переместить эту зависимость до родительского pom. Пока вы занимаетесь этим, вы также можете перемещать любые другие зависимости (альфа и чарли), но только если это имеет смысл для вашего проекта. Таким образом, для ситуации, описанной в предыдущих предложениях, вот решение с зависимостью в родительском pom:
источник
Это как ты сказал;
dependencyManagement
используется для извлечения всей информации о зависимостях в общий файл POM, упрощая ссылки в дочернем файле POM.Это становится полезным, когда у вас есть несколько атрибутов, которые вы не хотите перепечатывать в нескольких дочерних проектах.
Наконец,
dependencyManagement
может использоваться для определения стандартной версии артефакта для использования в нескольких проектах.источник
На мой взгляд, есть еще одна вещь, которая недостаточно освещена, и это нежелательное наследование .
Вот дополнительный пример:
Я заявляю в моем
parent
пом:бум! У меня есть это в моих
Child A
,Child B
иChild C
модули:version 18.0
в,Child B
если я хочу.Но что , если я в конечном итоге не нуждаясь гуавы в
Child C
, и ни в будущемChild D
иChild E
модулей?Они все еще унаследуют это, и это нежелательно! Это так же, как запах кода Java God Object, где вы наследуете некоторые полезные биты от класса, а также массу нежелательных вещей.
Это где
<dependencyManagement>
вступает в игру. Когда вы добавляете это в родительский pom, все ваши дочерние модули перестают его видеть . И поэтому вы вынуждены заходить в каждый отдельный модуль, который ему нужен, и объявлять его снова (Child A
иChild B
без версии).И, очевидно, вы этого не делаете
Child C
, и, следовательно, ваш модуль остается худым.источник
<dependencyManagement>
родительский pom, то по умолчанию зависимости не будут наследоваться в дочерних pom? Потому что в doc: maven.apache.org/guides/introduction/… при объяснении второго использования,<dependencyManagement>
похоже, что он будет унаследован по умолчанию. В одной строке они говорят, что: «Когда maven запускается в проекте B, версия 1.0 артефактов a, b, c и d будет использоваться независимо от версии, указанной в их pom», даже если «b» не используется в проект БЕсть несколько ответов с указанием различий между
<depedencies>
и<dependencyManagement>
тегами с Maven.Тем не менее, несколько пунктов разработаны ниже в сжатой форме:
<dependencyManagement>
позволяет консолидировать все зависимости (используемые на уровне дочернего pom), используемые в разных модулях - ясность , централизованное управление версиями зависимостей<dependencyManagement>
позволяет легко обновлять / понижать зависимости в зависимости от потребностей, в другом случае это необходимо выполнять на каждом дочернем уровне - согласованность<dependencies>
теге, всегда импортируются, в то время как зависимости, указанные<dependencyManagement>
в родительском pom, будут импортированы, только если дочерний элемент pom имеет соответствующую запись в своем<dependencies>
теге.источник
Извините, я очень поздно на вечеринку.
Позвольте мне попытаться объяснить разницу с помощью
mvn dependency:tree
командыРассмотрим пример ниже
Parent POM - мой проект
Детский POM - модуль данных
Дочерний POM - модуль приложения (не имеет дополнительных зависимостей, поэтому оставляя зависимости пустыми)
Запустив
mvn dependency:tree
команду, мы получим следующий результатGoogle guava указан как зависимость в каждом модуле (включая родительский), в то время как Apache Commons указан как зависимость только в модуле данных (даже в родительском модуле)
источник
Если зависимость была определена в элементе зависимостей pom верхнего уровня, дочернему проекту не нужно было явно указывать версию зависимости. если дочерний проект действительно определил версию, он переопределит версию, указанную в разделе PivdencyManagement верхнего уровня. Таким образом, версия зависимостей используется только тогда, когда дочерний элемент не объявляет версию напрямую.
источник
В родительском POM основное различие между
<dependencies>
и<dependencyManagement>
заключается в следующем:Артефакты, указанные в
<dependencies>
разделе, ВСЕГДА будут включены как зависимость дочернего модуля (модулей).Артефакты, указанные в разделе, будут включены в дочерний модуль только в том случае, если они также были указаны в разделе самого дочернего модуля. Почему это хорошо, спросите вы? потому что вы указываете версию и / или область действия в родительском элементе, и вы можете не указывать их при указании зависимостей в дочернем POM. Это может помочь вам использовать унифицированные версии для зависимостей для дочерних модулей без указания версии в каждом дочернем модуле.
источник
Просто, по моим собственным словам, вы
parent-project
поможете вам обеспечить 2 вида зависимостей:<dependencies>
в вашем разделеparent-project
, наследуются всемиchild-projects
child-projects
. Таким образом, вы используете<dependencyManagement>
раздел, чтобы объявить все зависимости, которые вы собираетесь использовать в вашем другомchild-projects
. Самое главное, что в этом разделе вы определяете,<version>
чтобы вам не приходилось объявлять его снова в своемchild-project
.С
<dependencyManagement>
моей точки зрения (поправьте меня, если я ошибаюсь) просто полезно, помогая вам централизовать версию ваших зависимостей. Это что-то вроде вспомогательной функции.источник
В Eclipse есть еще одна особенность
dependencyManagement
. Когдаdependencies
используется без него, необнаруженные зависимости замечены в файле pom. ЕслиdependencyManagement
используется, неразрешенные зависимости остаются незамеченными в pom-файле, а ошибки появляются только в java-файлах. (импорт и прочее ...)источник
Разница между ними лучше всего заключается в том, что кажется необходимым и достаточным определением элемента dependencyManagement, доступного в документах веб-сайта Maven:
dependencyManagement
«Информация о зависимостях по умолчанию для проектов, которые наследуются от этого. Зависимости в этом разделе не разрешаются сразу. Вместо этого, когда POM, производное от этого, объявляет зависимость, описанную соответствующими groupId и artifactId, версия и другие значения из этого раздела используются для этой зависимости, если они еще не были указаны ". [ https://maven.apache.org/ref/3.6.1/maven-model/maven.html ]
Следует прочитать вместе с дополнительной информацией, доступной на другой странице:
«... минимальным набором информации для сопоставления ссылки на зависимость с разделом dependencyManagement на самом деле является {groupId, artifactId, type, classifier}. Во многих случаях эти зависимости будут ссылаться на артефакты jar без классификатора. Это позволяет нам сокращать идентификатор, установленный на {groupId, artifactId}, так как по умолчанию для поля типа является jar, а классификатор по умолчанию равен нулю ». [ https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html ]
Таким образом, все подэлементы (область действия, исключения и т. Д.) Элемента зависимости - кроме groupId, artifactId, типа, классификатора, а не только версии - доступны для блокировки / дефолта в точке (и, таким образом, наследуются от там далее) вы указываете зависимость внутри dependencyElement. Если бы вы указали зависимость с подэлементами type и classifier (см. Первую цитируемую веб-страницу, чтобы проверить все подэлементы) как не jar и не null соответственно, вам потребуется {groupId, artifactId, classifier, type} ссылаться (разрешать) эту зависимость в любой точке наследования, происходящего из элемента dependencyManagement. Иначе, {groupId, artifactId} будет достаточно, если вы не собираетесь переопределять значения по умолчанию для классификатора и типа (jar и null соответственно). Так что по умолчанию это хорошее ключевое слово в этом определении; любой подэлемент (ы) (кроме groupId,
Таким образом, любой элемент зависимостей за пределами dependencyManagement, будь то ссылка на какой-либо элемент dependencyManagement или автономный, немедленно разрешается (т.е. устанавливается в локальный репозиторий и доступен для путей к классам).
источник