• Maven的依赖机制介绍


    以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_manage_dependencies.html

    一、前言

    Maven的一个核心特性就是依赖管理。当我们涉及到多模块的项目(包含成百个模块或者子项目),管理依赖就变成一项困难的任务。Maven展示出了它对处理这种情形的高度控制。

    二、可传递性依赖

    一种相当常见的情况,当一个库,比如说A依赖于其他库B。假如,另外一个项目C想要使用A,那么项目也需要使用库B

    Maven帮助避免这种要查明所有所需库的要求。Maven通过读取描述依赖的项目文件(pom.xml),找出它们的依赖类,来完成这项工作。

    我们只需要做的是在每个项目的pom.xml中定义好直接的依赖。Maven会自动处理剩下的事情。

    通过可传递性的依赖,被包含库的关系图可以迅速增加到一个很大的程度。当有多个库时可能就会有状况发生。Maven提供一些特性来控制可传递性依赖的大小。

    特性描述

    依赖调解(Dependency mediation

    当遇到多个版本的artifact的时候,决定使用哪个版本的依赖。如果两个版本的依赖在依赖树种处于同一深度时,第一个被声明的依赖将被使用。

    依赖管理(Dependency management

    当在传递性依赖中遇到时,直接指定要使用的构件版本。举个例子,项目C可以在dependencyManagement部分配置包含B作为依赖,并且直接控制引用B时使用哪个版本的B

    依赖作用域(Dependency scope

    按照当前构建的阶段,配置包含的依赖。

    排除依赖(Excluded dependencies

    任何传递性的依赖都可以通过使用<exclusion>节点来排除。举个例子,A依赖于B并且B依赖于C,那么A可以标记C为排除在外的。

    可选依赖(Optional dependencies

    任何传递性的依赖都可以通过使用<optional>节点来标记为可选的。举个例子,A依赖于B并且B依赖于C,现在B标记C为可选的,那么A可以不使用C

    三、依赖作用域(Dependency Scope)

    可传递性依赖发现可以通过下面提到的各种依赖作用域来限制。

    作用域(Scope)描述
    compile 此作用域表示项目classpath中的依赖可以使用,为默认作用域。
    provided 此作用域表示依赖将由JDK或者运行时的Web服务器或容器提供。
    runtime 此作用域表示依赖在编译时不需要,但在执行时需要。
    test 此作用域表示依赖只在测试编译和执行阶段可用。
    system 此作用域表示你必须提供系统路径。
    import 此作用域只在依赖是POM类型时使用。此作用域表示特定的POM需要替换成被引入的POM的部分中的依赖。

    提示:这个作用于就是<dependency>节点下的<scope>。

    四、依赖管理(Dependency Management)

    通常我们有基于某个通用项目的一组项目。 在此情形下, 我们可以创建一个通用的POM来把所有的通用的依赖包含进来,并把这个POM作为子项目POM的父POM。下面的例子将帮助你理解这个概念。

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

    • App-UI-WAR依赖于App-Core-libApp-Data-lib

    • RootApp-Core-libApp-Data-lib的父项目。

    • Root在它的依赖部分定义了Lib1Lib2Lib3作为依赖。

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

    App-Core-lib

    <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

    <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

    <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-libApp-Core-lib项目的依赖是在Root项目中列出的。

    • App-UI-WAR项目中不需要指定Lib1Lib2Lib3作为依赖。Maven使用可传递性依赖机制(Transitive Dependency Mechanism)可处理这种细节。

    五、其它参考

    https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

    https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

  • 相关阅读:
    React中条件渲染
    React 中this.setStat是批量执行的, 它发现做三次是多余的,所以只执行一次
    React 修改获取state中的值
    POJ3417 Network (树上差分)
    POJ3349 Snowflake Snow Snowflakes(Hash)
    Codeforces Round #630 (Div. 2) C. K-Complete Word(字符串)
    Codeforces Round #630 (Div. 2) B. Composite Coloring(数论)
    Codeforces Round #630 (Div. 2) A. Exercising Walk(水题)
    Codeforces Round #629 (Div. 3)/1328 E.Tree Queries(LCA)
    洛谷P5836 [USACO19DEC]Milk Visits S(LCA/并查集)
  • 原文地址:https://www.cnblogs.com/EasonJim/p/6854738.html
Copyright © 2020-2023  润新知