依赖管理是Maven 中最关键的部分,我们使用 Maven 最主要的就是使用它的依赖管理功能。

什么是依赖

 当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。在Maven工程中,只需要在pom.xml文件中使用 dependency 标签指定被依赖 jar 包的坐标,就可以以依赖的方式引入一个我们需要的 jar 包。

例子:

Maven的依赖管理功能

依赖的范围 

到上面的依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范 围有几个可选值,我们用得到的是:compile、test、provided 三个。 其中,compile是默认值。当你不声明scope的值的时候就是compile。

(1) 从项目结构角度理解 compile 和 test 的区别

Maven的依赖管理功能

结合具体例子:对于 HelloFriend 来说,Hello 就是服务于主程序的,junit 是服务于测试程序的。

HelloFriend 主程序需要 Hello 是非常明显的,测试程序由于要调用主程序所以也需要 Hello,所以 compile 范围依赖对主程序和测试程序都应该有效。 

 HelloFriend 的测试程序部分需要 junit 也是非常明显的,而主程序是不需要的,所以 test 范围依赖仅仅对于测试程序有效。

(2)从开发和运行这两个不同阶段理解 compile 和 provided 的区别 

 Maven的依赖管理功能

这里的项目部署基本可以理解为打成jar包的过程,也就是provided范围依赖的jar包不进入最后生成的jar包中。 

但是在开发中,这个jar包是通过Maven来提供的。注意这个开发包括主程序和测试程序。 

(3)有效性总结

Maven的依赖管理功能 

依赖的传递性 

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

上面的陈述表明只有compile范围的依赖才具有传递性,其他范围的依赖没有。

Maven的依赖管理功能 

依赖的排除 

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

例子:

Maven的依赖管理功能 

配置方式:

Maven的依赖管理功能 

排除后的效果:

Maven的依赖管理功能 

统一管理所依赖 jar 包的版本 

对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来。 

(1)统一声明版本号

Maven的依赖管理功能 

其中 atguigu.spring.version 部分是自定义标签。 

(2) 引用前面声明的版本号

Maven的依赖管理功能

依赖的原则:解决 jar 包冲突 

(1)路径最短者优先

Maven的依赖管理功能 

 (2)路径相同时先声明者优先(对于依赖路径长度相同的情况)

Maven的依赖管理功能

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

疑问:照这么看,是不会发生jar包冲突的问题了吗?还有,如果有的jar包就是要用固定版本的jar包,但是根据这个原则,使用了别的版本的jar包,这样也会导致错误吧?这样算不算是jar包冲突? 

相关文章:

  • 2021-12-30
  • 2021-12-18
  • 2022-12-23
  • 2022-12-23
  • 2021-06-10
  • 2021-09-30
  • 2021-10-21
猜你喜欢
  • 2021-07-16
  • 2021-10-21
  • 2021-11-03
  • 2021-06-26
相关资源
相似解决方案