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的生命周期生效的范围。
有哪些依赖范围
作用范围主要包含这几个:
- compile:全部周期
- provided:编译和运行
- runtime:运行和打包
- test:测试
- system:与provided配合使用
为什么设置依赖范围
默认的依赖范围是全局的,也就是如果不写,就默认在全部的生命周期有效。
那么,这样不是很好吗?全部都能用,这样不是更方便吗?
不是,举个最常见的例子:
我们的spring mvc项目中需要指定servlet,在开发的时候,我们用到的是jar包的servlet。在开发完成后,需要打包成jar包或者war包,然后部署到tomcat容器或者Jboss容器中,进行部署。但是,Tomcat或者Jboss的就已经包含了servlet了,我们的jar包或者war也有servlet的话,不就出现冲突了吗。
有了依赖范围,我就可以设置,让打包的时候,不要将servlet打入发布包,这样就不会存在问题了。
2. 项目继承的依赖
父子项目:依赖的继承关系只会发生在父子项目之间。
父子项目:最顶层的项目是父项目,父项目下面的项目就是子项目。
子项目默认拥有父项目的依赖,如果子项目也做了依赖的配置,那么以子项目的为准。
父子项目关系是由pom.xml中的parent
标签说明。
有了父子项目的关系后,子项目就可以使用父项目的变量,配置,依赖等等。
同时在ide中也会标识出来。
注意:父项目的打包方式必须是pom方式。
3. 项目聚合的依赖
在开发中有一个思想:尽可能使用聚合,而不是继承。
项目依赖的继承,要求项目之间必须有父子关系,才能进行继承。
如果是祖孙项目,就不能继承。
相比来说,聚合关系比依赖关系更加灵活。
聚合关系的设置:是通过modules
标签设置的。
我们在聚合的父项目上设置了servlet依赖
但是在子项目上没有设置servlet依赖:
但是子项目依然可以使用servlet依赖中的类
聚合与继承的区别:
继承是子项目维护关系,子项目通过增加parent
标签维护。
聚合是被聚合项目维护关系,子项目不需要做任何操作。
如果顶层项目下有许多的下级项目,这些下级项目都需要依赖一个jar包。
而且决定将jar包放到了顶层项目中。
如果使用继承关系,需要在全部的下级项目中增加标签。
如果使用聚合关系,只需要在顶层项目中增加全部的下级项目。
从这方面来说,可能聚合比依赖更加的快捷,方便。
聚合和继承可以同时使用。
4. 依赖冲突
4.1 项目依赖的直接冲突
如果我们的项目中依赖了两个不同的依赖,但是这两个依赖都依赖其他的依赖,而且这两个依赖的C,存在版本冲突
这样,在项目就需要两个版本的相同的依赖
我们依赖这样两个依赖
然后分析依赖,就会发现存在依赖冲突
就会发现1.1和1.1.1存在版本冲突。
poi依赖的是1.1版本
beanutils-core依赖1.1.1版本
一般情况下,依赖可以向后兼容,所以我们指定最新的版本就可以了。
所以,需要排除低版本的依赖。
此时就没有了冲突了
4.2 项目依赖的传递冲突
我们的项目依赖了A,但是A依赖了B和C,项目本身不依赖C
这样就存在了依赖冲突
我们首先创建A,B,C三个模块
然后先打包C
并且上传到私服中
A,B也打包上传。
不同的是A依赖了B,C
然后在D项目中依赖A
分析依赖树
我们排除依赖C
然后分析依赖树
此时在D项目中,就不会依赖C项目了。