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

Maven-Abhängigkeitsverwaltung

Eine der Kernfunktionen von Maven ist die Abhängigkeitsverwaltung. Wenn wir mit Multimodulprojekten arbeiten (die hunderttausende von Modulen oder Unterprojekten enthalten), werden die Abhängigkeitsbeziehungen zwischen den Modulen sehr komplex und die Verwaltung sehr schwierig. Für diese Situation bietet Maven eine hochgradig kontrollierte Methode.

Entdeckung von übertragbaren Abhängigkeiten

Ein ziemlich häufiges Szenario, zum Beispiel A abhängt von einer anderen Bibliothek B. Wenn ein anderes Projekt C A verwenden möchte, muss das Projekt C auch die Bibliothek B verwenden.

Maven kann die Notwendigkeit, alle erforderlichen Bibliotheken zu suchen, vermeiden. Maven findet durch Lesen des Projektfilters (pom.xml) die Abhängigkeitsbeziehungen zwischen den Projekten.

Wir müssen nur sicherstellen, dass die direkten Abhängigkeiten in jedem Projekts POM definiert sind. Andere Dinge erledigt Maven für uns.

Durch die übertragbare Abhängigkeit wächst das Diagramm aller enthaltenen Bibliotheken schnell. Wenn es wiederholte Bibliotheken gibt, steigt die mögliche Situation kontinuierlich an. Maven bietet einige Funktionen, um das Ausmaß der übertragbaren Abhängigkeiten zu steuern.

FunktionFunktionsbeschreibung
AbhängigkeitsanpassungEntscheiden, welche Abhängigkeitsversion verwendet wird, wenn mehrere manuell erstellte Versionen gleichzeitig auftreten. Wenn die Tiefe der beiden Abhängigkeitsversionen im Abhängigkeitsbaum gleich ist, wird die erste deklarierte Abhängigkeit verwendet.
依赖管理直接的指定手动创建的某个版本被使用。例如当一个工程 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 und App-Data-lib。

  • Root 是 App-Core-lib und 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>

Jetzt, wenn wir App bauen-UI-Bei einem WAR-Projekt findet Maven alle Abhängigkeiten durch das Durchsuchen des Abhängigkeitsdiagramms und baut die Anwendung.

Durch das obige Beispiel können wir die folgenden Schlüsselkonzepte lernen:

  • Öffentliche Abhängigkeiten können durch das Konzept des pom-Elterns zusammengefasst werden. App-Data-lib und App-Core-Die Abhängigkeiten des lib-Projekts sind im Root-Projekt aufgeführt (beziehen Sie sich auf den Pakettyp von Root, der ein POM ist).

  • Es ist nicht notwendig, in App-UI-W erklärt Lib1, lib2, Lib3 Dies ist seine Abhängigkeit. Maven realisiert diese Details durch die Verwendung des Mechanismus der übertragbaren Abhängigkeiten.