Maven-依赖管理
Maven-依赖管理
在pom.xml中,可以通过标签的方式添加第三方依赖的声明
第三方依赖的本质也是一个打包为jar的maven工程文件,他也有自己的gav标识
所以我们在标签中使用gav来确定寻找依赖即可
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.17.0</version>
</dependency>
</dependencies>
如果出现报红:找不到依赖项的问题,可以刷新maven工程重新获取依赖解决
第三方依赖的信息我们可以通过以下两种方式获取:
- maven提供的查询官网:Maven Repository: Search/Browse/Explore (mvnrepository.com)
- 通过maven-search插件:工具 -> maven-search
通过插件的方式是使用国内的镜像源,版本偶尔会低一点而且看不到用户使用量,官网的方式也很好用
版本号声明
除了在gav的version中配置版本号,我们在properties标签中可以声明依赖的版本号
命名方式以依赖名.version的方式即可,这个标签就成为了一个变量名
使用${}去获取变量的值
<properties>
<jackson.verson>2.17.1</jackson.verson>
……
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.verson}</version>
</dependency>
</dependencies>
scope
在dependency标签中,除了gav三条属性,还有scope属性
scope可以配置属性的作用域:
- compile(默认):全局可用
- test:测试可用
- Junit测试
- runtime:运行时有效
- MySql驱动
- provided:非运行时有效
- Tomcat相关:Servlet
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
如果不知道依赖应该何时生效,就使用默认的全局生效
依赖冲突和依赖传递
当出现A依赖B,B依赖C的时候,在正常项目中,我们需要导入ABC三个依赖
比如JSON的处理工具Jackson,需要导入:Jackson Databind、Jackson Core、Jackson Annotations三个依赖
这样每次导入大量依赖的方式特别繁琐,而且很有可能会出现版本问题
依赖传递
而Maven项目中,使用依赖传递的特性来解决这个问题
我们在Maven官网中查询到Jackson Databind的Compile Dependencies(全局依赖)中存在Jackson Core、Jackson Annotations
而后面两个依赖没有Compile Dependencies
所以我们在导入依赖时,只导入Jackson Databind即可,其他两个依赖会作为其全局依赖被Maven导入
依赖冲突
当ABC循环依赖时,会出现依赖无限导入的问题
Maven在导入依赖时,发现依赖重复导入时,即刻停止导入
依赖冲突的解决原则:
- 引用路径的长度,更短的优先
- 当引用路径的长度相同时,先被导入的优先
依赖导入的问题
- 仓库或网络问题
- pom.xml的标签配置问题
- 本地仓库被污染或损坏
前两个问题很好解决,第三个问题多半是因为下载过程中出现错误,导致依赖存在但不完全
找到本地仓库,查看依赖是否存在lastupdate文件,如果有删掉即可