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工程重新获取依赖解决

第三方依赖的信息我们可以通过以下两种方式获取:

通过插件的方式是使用国内的镜像源,版本偶尔会低一点而且看不到用户使用量,官网的方式也很好用


版本号声明

除了在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文件,如果有删掉即可