首页 > 其他分享 >Maven依赖管理

Maven依赖管理

时间:2024-08-16 19:58:30浏览次数:8  
标签:依赖 项目 管理 Maven 冲突 版本 声明

Maven 的核心功能之一是依赖管理。这一功能极大地简化了 Java 项目中库(也称为依赖)的添加、更新和冲突解决过程。Maven 通过其项目对象模型(POM, Project Object Model)和中央仓库系统来实现依赖管理。

1. 依赖声明

在 Maven 项目中,所有依赖都必须在项目的 pom.xml 文件中明确声明。通过 <dependency> 元素,可以指定所需的依赖库,包括其 GroupId、ArtifactId 和版本号。例如,如果想在的项目中添加 Junit 依赖,可以在 pom.xml 中添加类似下面的代码:

<dependencies>  
    <dependency>  
        <groupId>junit</groupId>  
        <artifactId>junit</artifactId>  
        <version>4.13.2</version>  
        <scope>test</scope>  
    </dependency>  
</dependencies>

2. 依赖传递

在 Maven 项目中,当声明一个依赖时,这个依赖本身可能还依赖于其他库。Maven 能够自动解析并下载这些传递性依赖,而无需手动声明它们。这种自动解析传递性依赖的能力极大地简化了依赖管理过程。

然而,依赖传递也可能导致问题,特别是当项目依赖于多个库,而这些库又依赖于相同但不同版本的第三方库时。这就是依赖冲突可能发生的场景。

3. 依赖范围

Maven 允许指定依赖的作用范围(scope),以控制依赖在项目的哪些部分中可用。常见的依赖范围包括:

  • compile:默认值,用于编译、测试和运行,也会被打包。
  • provided:JDK 或容器已提供,编译和测试时可用,但不会被打包。
  • runtime:编译时不需要,但在测试和运行时需要。
  • test:仅在测试编译和运行时可用,不会被打包。
  • system:与 provided 类似,但你需要显式提供依赖的 JAR,Maven 不会从仓库中寻找它。

 

4. 依赖冲突

依赖冲突发生在项目依赖的多个库之间,它们依赖于相同但版本不同的第三方库时。Maven 需要决定在最终的项目构建中使用哪个版本的库。Maven 使用一套规则来解决这些冲突,这些规则通常基于“最近者优先”(nearest dependency first)的原则。具体来说,Maven 会查看项目的依赖树,并选择路径最短的依赖(即最靠近项目的依赖)版本。

演示:

当直接引用或者间接引用出现了相同的 jar 包!这时呢,一个项目就会出现相同的重复jar 包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!

maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决冲突的方式,当需要显式地指定一个依赖的版本,以确保项目使用正确的库版本时可以使用。

如下:

  1. 依赖管理(Dependency Management):在父 POM 中使用 <dependencyManagement> 元素来指定依赖的版本,但不实际声明它们。子模块可以继承这些依赖项,但只能声明它们而不指定版本。这样,子模块就会使用父 POM 中指定的版本。

  2. 直接依赖声明:在项目的 POM 中直接声明所需的依赖项和版本。如果项目中直接声明了一个依赖项的版本,那么 Maven 会使用该版本,而不是通过传递性依赖解析的版本。

  3. 依赖排除(Dependency Exclusions):可以在依赖声明中使用 <exclusions> 元素来排除特定的传递性依赖。这可以防止 Maven 将这些传递性依赖包含在项目构建中。

  4. 强制版本(Dependency Enforcement):在某些情况下,可能需要强制 Maven 使用特定版本的依赖项,即使它可能不是通过“最近者优先”规则解析的版本。这可以通过 Maven 的 dependency:tree 插件和其他相关工具来实现,但它们通常更多地用于分析和诊断依赖问题,而不是直接解决冲突。

  5. 使用属性(Properties):在 POM 中定义属性,并在依赖版本中使用这些属性。这有助于在整个项目中保持版本一致性,并简化依赖声明的更新。

5. 依赖优化

Maven 还提供了多种工具和插件来优化依赖,如 Maven Dependency Plugin,它可以帮助分析项目的依赖关系,查看依赖树,解析和解决冲突,以及执行其他依赖相关的任务。

6. 中央仓库

Maven 依赖管理的另一个关键部分是中央仓库(Central Repository)。这是一个由 Maven 社区维护的远程仓库,包含了大量的 Java 库和框架。当 Maven 项目需要某个依赖时,它首先会在本地仓库中查找,如果找不到,则会尝试从配置的远程仓库(如中央仓库)中下载。

总结

总的来说,Maven 的依赖管理功能极大地简化了 Java 项目中依赖库的管理和维护工作,使得开发人员可以更加专注于实际的业务逻辑开发。

标签:依赖,项目,管理,Maven,冲突,版本,声明
From: https://blog.csdn.net/qq_68874993/article/details/141266160

相关文章

  • 基于flask+vue框架的的校园后台报修管理系统设计与实现[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着校园信息化建设的不断深入,各类基础设施的维护与保养成为保障教学、科研及师生生活顺利进行的重要环节。然而,传统的报修方式往往依赖于......
  • 基于flask+vue框架的基于Android的大学校园车辆管理系统统后[开题+论文+程序]-计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着大学校园规模的不断扩大与师生数量的激增,校园内的车辆管理问题日益凸显。传统的人工管理方式不仅效率低下,难以满足高峰时段的车辆进出......
  • 基于flask+vue框架的高校日常办公管理系统设计与实现[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大与教育信息化的深入发展,高校日常办公管理面临着前所未有的挑战。传统的手工或半自动化管理方式已难以满足日益增长......
  • 基于flask+vue框架的大学生成绩管理系统[开题+论文+程序]-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的普及与信息化技术的飞速发展,大学生成绩管理成为高校教务管理中至关重要的一环。传统的手工成绩记录与管理方式不仅效率低下......
  • C/C++内存管理
    文章目录前言C/C++内存分布C语言内存管理malloccallocreallocreallocarrayfreeC++内存管理new/delete内置类型自定义类型operatornew/operatordelete定位new内存泄漏前言        C++的内存管理是程序设计中的一个关键部分,涉及到内存的分配、使用和释......
  • python-flask计算机毕业设计中医院信息管理系统(程序+开题+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着中医药事业的蓬勃发展,中医院作为传承与发展中医药文化的重要载体,其日常运营管理的复杂性和高效性需求......
  • C++八股文——内存管理(堆和栈的区别? C++内存分区? 内存泄漏?如何避免?什么是智能指针?有哪
    文章目录C++内存管理堆和栈的区别C++内存分区内存泄漏?如何避免?1、什么是内存泄露?2、内存泄漏的分类3、什么操作会导致内存泄露?4、如何防⽌内存泄露?5、智能指针有了解哪些?6、构造函数,析构函数要设为虚函数吗,为什么?什么是智能指针?有哪些种类?new和malloc有什么区别?d......
  • 【源码+论文】springboot师生共评的作业管理系统设计与实现
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql获取资料请私聊我2.2B/S结构B/S架构是一种基于互联网系统的软件系统开发架构,是现如今在软件系统开发中采用非常大量的一种软件系统结构。现如今B/S架构已经被大量使用,打破了C/S结构的结构,给基于网络结构的软件......
  • 【源码+论文】基于springboot的课程作业管理系统
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql获取资料请私聊我Java就像C语言、C#语言等,也是一种程序开发语言,而它的特点就是面向对象。作为一种程序开发与设计的语言,它有很多特性,主要特性就是面向对象、夸平台以及可以分布式运行。Java语言项目不但安全性高......
  • 2024.8.15(python管理mysql、Mycat实现读写分离)
    一、python管理mysql1、搭建主mysql[root@mysql57~]#tar-xfmysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [root@mysql57~]#cp-rmysql-5.7.44-linux-glibc2.12-x86_64/usr/local/mysql[root@mysql57~]#rm-rf/etc/my.cnf[root@mysql57~]#mkdir/usr/local/......