English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Управление зависимостями Maven

Одна из основных функций Maven - управление зависимостями. При обработке многоуровневых проектов (сотни или тысячи модулей или подпроектов), зависимость между модулями становится очень сложной, и управление становится трудным. Для этой ситуации Maven предоставляет метод с высокой степенью контроля.

Обнаружение передаваемых зависимостей

Quite a common situation, for example, A depends on another library B. If another project C wants to use A, then project C also needs to use library B.

Maven может избежать поиска всех необходимых библиотек. Maven читает проектные файлы (pom.xml), чтобы найти зависимости между проектами.

Нам нужно только определить прямые зависимости в каждом проекте pom. Остальные вещи Maven решит за нас.

Через передаваемые зависимости граф всех включенных библиотек быстро растет. При наличии дублирующихся библиотек возможные ситуации будут продолжать возрастать. Maven предоставляет функции для контроля степени передаваемых зависимостей.

ФункцияОписание функции
Регулирование зависимостейРешение о том, какая версия зависимости будет использована, когда одновременно появляется несколько версий, созданных вручную. Если глубина двух версий в дереве зависимостей одинакова, используется первая объявленная зависимость.
依赖管理Прямое указание на использование определенной версии, созданной вручную. Например, когда проект C включает в свою модуль управления зависимостями проект B, то B зависит от A, и A может определить версию, которую будет использовать при обращении к B.
Дапазон зависимостиЗависимости, включенные в каждый этап процесса 构建.
Исключение зависимостейЛюбая передаваемая зависимость может быть исключена с помощью элемента "exclusion". Например: A зависит от B, B зависит от C. Таким образом, A может пометить C как "исключенный".
Опциональные зависимостиЛюбая передаваемая зависимость может быть помечена как опциональная, используя элемент "optional". Например: Зависимость A от B, B от C. Таким образом, B может пометить C как опциональную, и A больше не будет использовать C.

Дапазон зависимости

Обнаружение передаваемых зависимостей можно ограничить с помощью следующих диапазонов зависимостей:

ДапазонОписание
Этап компиляцииЭтот диапазон указывает, что соответствующие зависимости действительны только в пути классов проекта. По умолчанию.
Этап предоставленияЭтот диапазон указывает, что соответствующие зависимости предоставляются в режиме выполнения JDK или сетевым сервером.
Этап выполненияЭтот диапазон указывает, что соответствующие зависимости не являются необходимыми на этапе компиляции, но необходимы на этапе выполнения.
Этап тестированияЭтот диапазон указывает, что соответствующие зависимости существуют только на этапах тестирования компиляции и выполнения.
系统阶段该范围表明你需要提供一个系统路径。
导入阶段该范围只在依赖是一个 pom 里定义的依赖时使用。同时,当前项目的POM 文件的  部分定义的依赖关系可以取代某特定的 POM。

依赖管理

通常情况下,在一个共同的项目下,有一系列的项目。在这种情况下,我们可以创建一个公共依赖的 pom 文件,该 pom 包含所有的公共的依赖关系,我们称其为其他子项目 pom 的 pom 父。接下来的一个实例可以帮助你更好地理解这个概念。

接下来是上面依赖图的详情说明:

  • App-UI-WAR 依赖于 App-Core-lib 和 App-Data-lib。

  • Root 是 App-Core-lib 和 App-Data-lib 的父项目。

  • Root 在它的依赖部分定义了 Lib1、lib2 和 Lib3 作为依赖。

App-UI-WAR 的 pom.xml 文件代码如下:

<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>

App-Core-lib 的 pom.xml 文件代码如下:

<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-Data-lib 的 pom.xml 文件代码如下:

<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>

Root 的 pom.xml 文件代码如下:

<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, который является POM).

  • Необходимо не объявлять Lib1, lib2, Lib3 в App-UI-W как его зависимости. Maven реализует эту деталь с помощью механизма передаваемых зависимостей.