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

Maven 依存関係管理

Mavenの核となる特性の一つは依存管理です。複数のモジュールを持つプロジェクト(数百から数千ものモジュールやサブプロジェクトを含む)を扱う場合、モジュール間の依存関係は非常に複雑になり、管理も難しくなります。このような状況に対して、Mavenは高度な制御方法を提供します。

可伝播依存の発見

非常に一般的な状況、例えばAが他のライブラリBに依存している場合、もし別のプロジェクトCがAを使用しようとするならば、Cプロジェクトもまたライブラリ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はその依存関係部分でLibを定義しています。1、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プロジェクトの依存関係はルートプロジェクトでリストされています(ルートのパッケージタイプを参照してください、それはPOMです)。

  • Appで必要ありません-UI-W内でLibを宣言します1, lib2, Lib3 これはその依存関係です。Mavenは可伝搬依存関係メカニズムを使用してこの詳細を実現します。