Яка різниця між залежністю типу "pom" від області "імпорт" та без "імпорту"?


112

Починаючи з Maven 2.0.9 є можливість включити

<type>pom</type>
<scope>import</scope>

у <dependencyManagement>розділі.

Як я розумію, це буде "замінено" залежностями, включеними в цю помпу, як ніби вони були спочатку визначені тут.

Яка різниця між рішенням вище і простою залежністю від цієї помпону без importрозмаху (я бачив, як останні називають "групуванням залежностей")? Чи є лише відмінність у тому, що такі "згруповані" залежності мають нижчий пріоритет при вирішенні пріоритетності залежностей?

Відповіді:


187

Ви можете імпортувати лише керовані залежності . Це означає, що ви можете імпортувати лише інші POM в dependencyManagementрозділ POM свого проекту. тобто

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

Потім відбувається те, що всі залежності, визначені в dependencyManagementрозділі other-pom-artifact-id, включаються в dependencyManagementрозділ вашого POM . Потім ви можете посилатися на ці залежності в dependencyрозділі вашої POM (і всіх його дочірніх POM), не включаючи і versionт.д.

Однак якщо у вашому POM ви просто визначите звичайну залежність, other-pom-artifact-idтоді всі dependenciesз dependencyрозділу розділу other-pom-artifact-idвключені транзитивно у ваш проект - однак залежності, визначені в dependencyManagementрозділі, other-pom-artifact-idвзагалі не включаються.

Отже, в основному два різні механізми використовуються для імпорту / включаючи два різних типи залежностей (керовані та нормальні залежності).

На веб-сайті maven є гарна сторінка, яка може пояснити це набагато краще, ніж я можу, Dependency Management в Maven, а також містить конкретну інформацію про імпорт залежностей .


1
Якщо pomA in є батьком pomB, чи можете ви розмістити B в управлінні залежність проекту A зі сферою застосування import?
Janez Kuhar

чудова відповідь, щоб пояснити, як це працює, але чому ?? чому ви не хочете включити інші залежності транзитивно? Ви також можете зробити і те, і інше? імпортувати other-pom-artifact-id, а потім оголошувати other-pom-artifact-id як залежність?
Junchen Лю

В одній статті про DZone йдеться про щось інше: ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>DRY та Skinny War
coz

1
@JunchenLiu: Отже, скажемо, що ви використовуєте лише пару функцій проекту A, тож ви можете вибрати лише ті перехідні залежності, які необхідні для цієї функції. Ви можете це вирішити, використовуючи також <exclude> в <dependency>. Наприклад, замовіть
Nitiraj

15

Ви не можете мати pomтип типу як simple dependencyінший проект. (Ну, можна - але нічого корисного не принесе). Тут можуть бути лише parent-childвідносини. Це по суті managing dependency through inheritance.

importобласть для pomтипової залежності в <dependencyManagement>розділі дозволяє досягти еквівалента multiple inheritance.

У вас могли бути різні poms- у кожного managingбукет пов'язаних залежностей. Проекти, які використовують їх, могли б importперераховувати, pomsа потім уточнювати залежності, які їм потрібні, не турбуючись про версію. Це по суті bill of materialsконцепція, яка проілюстрована у посиланнях, визначених @ DB5.

Це допомагає уберегти parent pomsскладні багатомодульні проекти від занадто великих та громіздких.


8
Ти впевнений? Я поставив регулярну пом (маючи власні залежності) як звичайну залежність від іншого проекту (війна упаковки) і отримав усі залежності від пом-проекту, включеного в WEB-INF / lib цільового проекту. Ось чому я задаю це питання :)
grafthez

2
Дякую @Raghuram, повністю забув згадати батьківський варіант POM, відповідаючи на запитання. Що стосується того, щоб мати проект типу pom, як просту залежність, це можливо. Як уже згадувалося в оригінальному запитанні, його можна використовувати для групування залежностей
DB5,


5

Два поняття, дуже схожі на об'єктно-орієнтовану парадигму програмування, допоможуть відповісти на питання:

  1. Розділ залежність управління керує лише залежностями та їх деталями у поточному проекті - метою є управління деталями та повторне використання в інших проектах, або через спадкування ( батьківський ), або імпорт ( сфера ). Це як декларування типу даних у програмі та надання їх для використання.

  2. Розділ залежності визначає фактичне використання залежностей у проекті, необов'язково успадковує деталі (тобто версію тощо) залежностей, оголошених під управлінням залежності . Ось чому у вас будуть бракувати залежностей, якщо ви лише поставите їх у залежність управління . Це аналогічно екземпляру змінного екземпляра типу даних у програмі, де це необхідно.


Це добре і зрозуміло, але це відповідає на інше питання, ніж вище. :-)
Rick-777
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.