maven 排除pom依赖_大佬用两个实例就讲完了Maven的依赖管理关系

本文通过两个实例深入讲解Maven的依赖管理,包括依赖的目的、范围(compile、test、provided)、传递性及如何排除不想要的依赖。强调了统一管理jar包版本的重要性,并介绍了解决jar包冲突的两大原则。
摘要由CSDN通过智能技术生成

Maven讲解之 依赖管理

本章节我们将通过两个例子来实例讲解一下Maven的依赖关系。

两个例子

新建两个Maven Project(War)。一客户模块和市场模块作为例子(只举业务逻辑例子,无核心代码)。另外Customer Model 将依赖于Market Model。

  • Market Model
  • 目录结构
55f15941f670209fb1f70a3fd926ac22.png
  • 操作点
  • install(install 该项目,使Maven 初次下载其生命周期管理的组件)

右键项目->Run as ->Maven install

  • compile(编译该项目形成Market的SNAPSHOT jar(编译后的class文件))

右键项目->Run as ->Maven build….. ->goals:compile

  • pom.xml
  1. 4.0.0
  2. com.sspts.oscar
  3. Market
  4. 0.0.1-SNAPSHOT
  5. war

Customer Model

目录结构

251febf27ab85aeade99b467498182fa.png

操作点

  • 统一管理jar包版本
  1. UTF-8
  2. 4.0.4.RELEASE
  • 引用其他模块的jar包
  1. com.sspts.oscar
  2. Market
  3. 0.0.1-SNAPSHOT
  4. compiler
  • 去掉对Spring core jar 包中对commons-logging的依赖
  1. commons-logging
  2. commons-logging
  • pom.xml
  1. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. 4.0.0
  3. com.sspts.oscar
  4. Customer
  5. 0.0.1-SNAPSHOT
  6. war
  7. UTF-8
  8. 4.0.4.RELEASE
  9. org.springframework
  10. spring-aop
  11. ${spring.version}
  12. commons-logging
  13. commons-logging
  14. org.springframework
  15. spring-aspects
  16. ${spring.version}
  17. org.springframework
  18. spring-beans
  19. ${spring.version}
  20. org.springframework
  21. spring-context
  22. ${spring.version}
  23. com.sspts.oscar
  24. Market
  25. 0.0.1-SNAPSHOT
  26. compiler
  27. javax.servlet
  28. javax.servlet-api
  29. 3.1.0
  30. provided

注:本例子只引用了Spring 的部分jar包,请结合实际需求引用spring的jar包。

实例讲解

Maven 中最关键的部分,我们使用 Maven 最主要的就是使用它的依赖管理功能。要理解和掌握 Maven 的依赖管理,我们只需要解决一下几个问题:

  • 依赖的目的是什么

当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。那么如何在项目中以依赖的方式引入一个我们需要的 jar 包呢?

答案非常简单,就是使用 dependency 标签指定被依赖 jar 包的坐标就可以了。如本章例子,Customer Model 引用到了Market Model 的SNAPSHOT

  1. com.sspts.oscar
  2. Market
  3. 0.0.1-SNAPSHOT
  4. compiler
  • 依赖的范围

大家注意到上面的依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范围有几个可选值,我们用得到的是:compile、test、provided 三个。

  • [1]从项目结构角度理解 compile 和 test 的区别
b72655a7e080bc1bcc548e9b8d18e42b.png

从上面的依赖关系可以看出不论是主程序(main下面的JAVA文件)还是测试程序(test下面的JAVA文件)都使用到了compile依赖,而test依赖只用于测试程序。

  • [2]从开发和运行这两个不同阶段理解 compile 和 provided 的区别
71ccebc5e7e126f7d0e2723647cb6891.png

正如我们在Customer Model pom.xml中对 Servlet API的依赖范围定义所示,将Servlet API的依赖范围定义为provided,即在开发阶段我们会依赖Servlt API,一旦项目部署以后,项目将直接忽略Servlet API,二运行阶段酱油Servlet容器提供Servlet API。

  • [3]有效性总结
77aae22c6e4ed90b14195372c175143f.png
  • 依赖的传递性

A 依赖 B,B 依赖 C,A 能否使用 C 呢?那要看 B 依赖 C 的范围是不是 compile,如果是则可用,否则不可用。

c070f3a4a0651ce5c438eb4970dd67f6.png
  • 依赖的排除

如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。

  • 情景举例

不排除依赖时

2da941ef7beccf7f065a86deea2c4dd7.png
  1. org.springframework
  2. spring-aop
  3. ${spring.version}
  • 排除依赖时
52abf63498aaf2fc9ccc1b92041967bc.png
  1. org.springframework
  2. spring-aop
  3. ${spring.version}
  4. commons-logging
  5. commons-logging
  • 统一管理所依赖 jar 包的版本

对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来。例如在Customer Model中我们在pom.xml对spring 以及sourceEncoding做了版本和格式的限制。

  • 统一声明版本号
  1. UTF-8
  2. 4.0.4.RELEASE
  • 引用前面声明的版本号
  1. org.springframework
  2. spring-aspects
  3. ${spring.version}
  • 依赖的原则:解决 jar 包冲突

路径最短者优先

654dc86cf9e4bf2e5c027293b7d7bca6.png

路径相同时先声明者优先

a5a3e37aec8dfe876fb3ae651fb93825.png

这里“声明”的先后顺序指的是 dependency 标签配置的先后顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值