Maven依赖

github地址
https://github.com/a18792721831/studyMaven.git
文章列表:
Maven最全知识
[INFO] Generating project in Batch mode
Maven项目的目录结构
Maven仓库解析
Maven pom.xml解析
MVN命令与生命周期
Maven私有仓库的搭建和使用
Maven依赖

1. 依赖范围

什么是依赖范围

依赖范围:依赖的jar包,在Maven的生命周期生效的范围。

有哪些依赖范围

image-20201029192102582

作用范围主要包含这几个:

  • compile:全部周期
  • provided:编译和运行
  • runtime:运行和打包
  • test:测试
  • system:与provided配合使用

image-20201029192323364

为什么设置依赖范围

默认的依赖范围是全局的,也就是如果不写,就默认在全部的生命周期有效。

那么,这样不是很好吗?全部都能用,这样不是更方便吗?

不是,举个最常见的例子:

我们的spring mvc项目中需要指定servlet,在开发的时候,我们用到的是jar包的servlet。在开发完成后,需要打包成jar包或者war包,然后部署到tomcat容器或者Jboss容器中,进行部署。但是,Tomcat或者Jboss的就已经包含了servlet了,我们的jar包或者war也有servlet的话,不就出现冲突了吗。

有了依赖范围,我就可以设置,让打包的时候,不要将servlet打入发布包,这样就不会存在问题了。

2. 项目继承的依赖

父子项目:依赖的继承关系只会发生在父子项目之间。

父子项目:最顶层的项目是父项目,父项目下面的项目就是子项目。

子项目默认拥有父项目的依赖,如果子项目也做了依赖的配置,那么以子项目的为准。

父子项目关系是由pom.xml中的parent标签说明。

image-20201029194819188

有了父子项目的关系后,子项目就可以使用父项目的变量,配置,依赖等等。

同时在ide中也会标识出来。

image-20201029195102935

注意:父项目的打包方式必须是pom方式。

3. 项目聚合的依赖

在开发中有一个思想:尽可能使用聚合,而不是继承。

项目依赖的继承,要求项目之间必须有父子关系,才能进行继承。

如果是祖孙项目,就不能继承。

相比来说,聚合关系比依赖关系更加灵活。

聚合关系的设置:是通过modules标签设置的。

image-20201029195916363

我们在聚合的父项目上设置了servlet依赖

image-20201029195944818

但是在子项目上没有设置servlet依赖:

image-20201029200015806

但是子项目依然可以使用servlet依赖中的类
image-20201029200043604

聚合与继承的区别:

继承是子项目维护关系,子项目通过增加parent标签维护。

聚合是被聚合项目维护关系,子项目不需要做任何操作。

如果顶层项目下有许多的下级项目,这些下级项目都需要依赖一个jar包。

而且决定将jar包放到了顶层项目中。

如果使用继承关系,需要在全部的下级项目中增加标签。

如果使用聚合关系,只需要在顶层项目中增加全部的下级项目。

从这方面来说,可能聚合比依赖更加的快捷,方便。

聚合和继承可以同时使用。

4. 依赖冲突

4.1 项目依赖的直接冲突

如果我们的项目中依赖了两个不同的依赖,但是这两个依赖都依赖其他的依赖,而且这两个依赖的C,存在版本冲突

image-20201031145616530

这样,在项目就需要两个版本的相同的依赖

我们依赖这样两个依赖

image-20201031150238802

然后分析依赖,就会发现存在依赖冲突

image-20201031150302705

就会发现1.1和1.1.1存在版本冲突。

poi依赖的是1.1版本

beanutils-core依赖1.1.1版本

一般情况下,依赖可以向后兼容,所以我们指定最新的版本就可以了。

所以,需要排除低版本的依赖。

image-20201031150730278

此时就没有了冲突了

image-20201031150752806

4.2 项目依赖的传递冲突

我们的项目依赖了A,但是A依赖了B和C,项目本身不依赖C

image-20201031145831842

这样就存在了依赖冲突

我们首先创建A,B,C三个模块

image-20201031151232284

然后先打包C

image-20201031151320501

并且上传到私服中

image-20201031151347244

A,B也打包上传。

不同的是A依赖了B,C

image-20201031151554900

然后在D项目中依赖A

image-20201031151719475

分析依赖树

image-20201031151743864

我们排除依赖C

image-20201031151910114

然后分析依赖树

image-20201031151927848

此时在D项目中,就不会依赖C项目了。