Одной из основных функций Maven является управление зависимостями. Управление зависимостями является сложной задачей, когда мы имеем дело с многомодульными проектами (состоящими из сотен модулей / подпроектов). Maven обеспечивает высокий уровень контроля для управления такими сценариями.
Открытие транзитивных зависимостей
Довольно часто случается, что библиотека, скажем, A, зависит от другой библиотеки, скажем, B. Если другой проект C хочет использовать A, то этот проект также требует использования библиотеки B.
Maven помогает избежать таких требований, чтобы обнаружить все необходимые библиотеки. Maven делает это, читая файлы проекта (pom.xml) зависимостей, выясняя их зависимости и так далее.
Нам нужно только определить прямую зависимость в каждом проекте. Maven обрабатывает все остальное автоматически.
Благодаря транзитивным зависимостям граф включаемых библиотек может быстро расти в значительной степени. Случаи могут возникнуть при наличии дублирующих библиотек. Maven предоставляет несколько функций для контроля степени переходных зависимостей.
Sr.No. | Характеристика и описание |
---|---|
1 |
Зависимость посредничество Определяет, какую версию зависимости следует использовать при обнаружении нескольких версий артефакта. Если две версии зависимостей находятся на одной и той же глубине в дереве зависимостей, будет использоваться первая объявленная зависимость. |
2 |
Управление зависимостями Непосредственно укажите версии артефактов, которые будут использоваться, когда они встречаются в переходных зависимостях. Например, проект C может включать B в качестве зависимости в своем разделе «Управление зависимостями» и напрямую контролировать, какую версию B следует использовать, когда на нее когда-либо ссылаются. |
3 |
Сфера зависимости Включает зависимости в соответствии с текущим этапом сборки. |
4 |
Исключенные зависимости Любая транзитивная зависимость может быть исключена с помощью элемента «exclusion». Например, A зависит от B, а B зависит от C, тогда A может пометить C как исключенное. |
5 |
Необязательные зависимости Любая транзитивная зависимость может быть помечена как необязательная с использованием «необязательного» элемента. Например, A зависит от B, а B зависит от C. Теперь B пометил C как необязательный. Тогда A не будет использовать C. |
Зависимость посредничество
Определяет, какую версию зависимости следует использовать при обнаружении нескольких версий артефакта. Если две версии зависимостей находятся на одной и той же глубине в дереве зависимостей, будет использоваться первая объявленная зависимость.
Управление зависимостями
Непосредственно укажите версии артефактов, которые будут использоваться, когда они встречаются в переходных зависимостях. Например, проект C может включать B в качестве зависимости в своем разделе «Управление зависимостями» и напрямую контролировать, какую версию B следует использовать, когда на нее когда-либо ссылаются.
Сфера зависимости
Включает зависимости в соответствии с текущим этапом сборки.
Исключенные зависимости
Любая транзитивная зависимость может быть исключена с помощью элемента «exclusion». Например, A зависит от B, а B зависит от C, тогда A может пометить C как исключенное.
Необязательные зависимости
Любая транзитивная зависимость может быть помечена как необязательная с использованием «необязательного» элемента. Например, A зависит от B, а B зависит от C. Теперь B пометил C как необязательный. Тогда A не будет использовать C.
Область зависимостей
Транзитивные зависимости Обнаружение может быть ограничено с использованием различных областей зависимости, как указано ниже.
Sr.No. | Область применения и описание |
---|---|
1 |
компилировать Эта область указывает, что зависимость доступна в classpath проекта. Это область действия по умолчанию. |
2 |
предоставлена Эта область указывает, что зависимость должна предоставляться JDK или веб-сервером / контейнером во время выполнения. |
3 |
время выполнения Эта область указывает, что зависимость не требуется для компиляции, но требуется во время выполнения. |
4 |
тестовое задание Эта область указывает, что зависимость доступна только для фаз компиляции и выполнения теста. |
5 |
система Эта область означает, что вы должны указать системный путь. |
6 |
Импортировать Эта область используется только в том случае, если зависимость имеет тип pom. Эта область указывает, что указанное POM должно быть заменено зависимостями в разделе <dependencyManagement> этого POM. |
компилировать
Эта область указывает, что зависимость доступна в classpath проекта. Это область действия по умолчанию.
предоставлена
Эта область указывает, что зависимость должна предоставляться JDK или веб-сервером / контейнером во время выполнения.
время выполнения
Эта область указывает, что зависимость не требуется для компиляции, но требуется во время выполнения.
тестовое задание
Эта область указывает, что зависимость доступна только для фаз компиляции и выполнения теста.
система
Эта область означает, что вы должны указать системный путь.
Импортировать
Эта область используется только в том случае, если зависимость имеет тип pom. Эта область указывает, что указанное POM должно быть заменено зависимостями в разделе <dependencyManagement> этого POM.
Управление зависимостями
Обычно у нас есть набор проектов в рамках общего проекта. В таком случае мы можем создать общий pom, имеющий все общие зависимости, а затем сделать этот pom родителем poms подпроекта. Следующий пример поможет вам понять эту концепцию.
Ниже приведены подробности приведенного выше графика зависимости.
- App-UI-WAR зависит от App-Core-lib и App-Data-lib.
- Root является родителем App-Core-lib и App-Data-lib.
- Root определяет Lib1, lib2, Lib3 как зависимости в своем разделе зависимостей.
Приложение-интерфейс-WAR
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-UI-WAR</artifactId> <version>1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
Приложение-Core Пб
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
App-данных Пб
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
корень
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>Root</artifactId> <version>1.0</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname1</groupId> <artifactId>Lib1</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname2</groupId> <artifactId>Lib2</artifactId> <version>2.1</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname3</groupId> <artifactId>Lib3</artifactId> <version>1.1</version> </dependency> </dependencies> </project>
Теперь, когда мы создаем проект App-UI-WAR, Maven обнаружит все зависимости путем обхода графа зависимостей и создаст приложение.
Из приведенного выше примера мы можем изучить следующие ключевые понятия —
Общие зависимости могут быть размещены в одном месте с использованием концепции родительского pom. Зависимости проекта App-Data-lib и App-Core-lib перечислены в проекте Root (см. Тип упаковки Root. Это POM).
Нет необходимости указывать Lib1, lib2, Lib3 в качестве зависимости в App-UI-WAR. Maven использует механизм транзитивной зависимости для управления такими деталями.