位置:首页 > Java > Maven 依赖管理详解

Maven 依赖管理详解

时间:2026-08-13  |  作者:穿越地图的猫  |  阅读:0

Ma ven 最关键的能力之一,就是把依赖管理这件事做得更有章法。尤其是在多模块项目里——模块、子项目少则几十个,多则成百上千个——彼此之间的依赖关系往往会迅速变复杂,维护成本也随之上升。面对这种局面,Ma ven 给出了一套控制力很强的解决方式。

可传递性依赖发现

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

Ma ven 可以避免去搜索所有所需库的需求。Ma ven 通过读取项目文件(pom.xml),找出它们项目之间的依赖关系。

我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。其他的事情 Ma ven 会帮我们搞定。

通过可传递性的依赖,所有被包含的库的图形会快速的增长。当有重复库时,可能出现的情形将会持续上升。Ma ven 提供一些功能来控制可传递的依赖的程度。

功能 功能描述
依赖调节 决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。
依赖管理 可以直接指定手动创建的某个版本供使用。例如,假设项目 C 包含了项目 B 作为其依赖项,而项目 B 又依赖于项目 A。在这种情况下,可以明确指定在项目 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。下面这个例子,会更直观地把这个概念说明白。

Maven 依赖管理详解_wishdown.com

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

  • 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 文件代码如下:


      4.0.0
      com.companyname.groupname
      App-UI-WAR
      1.0
      war
      
         
            com.companyname.groupname
            App-Core-lib
            1.0
         
        
      
         
            com.companyname.groupname
            App-Data-lib
            1.0
         
        

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


      
         Root
         com.companyname.groupname
         1.0
      
      4.0.0
      com.companyname.groupname
      App-Core-lib
      1.0 
      jar

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


      
         Root
         com.companyname.groupname
         1.0
      
      4.0.0
      com.companyname.groupname
      App-Data-lib
      1.0   
      jar

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


      4.0.0
      com.companyname.groupname
      Root
      1.0
      pom
      
         
            com.companyname.groupname1
            Lib1
            1.0
         
        
      
         
            com.companyname.groupname2
            Lib2
            2.1
         
        
      
         
            com.companyname.groupname3
            Lib3
            1.1
         
        

现在当我们构建 App-UI-WAR 项目时, Ma ven 将通过遍历依赖关系图找到所有的依赖关系,并且构建该应用程序。

通过上面的例子,我们可以学习到以下关键概念:

  • 公共的依赖可以使用 pom 父的概念被统一放在一起。App-Data-lib 和 App-Core-lib 项目的依赖在 Root 项目里列举了出来(参考 Root 的包类型,它是一个 POM).
  • 没有必要在 App-UI-W 里声明 Lib1, lib2, Lib3 是它的依赖。 Ma ven 通过使用可传递的依赖机制来实现该细节。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多