首页 > 其他分享 >Maven学习(依赖版本维护、依赖传递、解决Maven依赖冲突的3种方式)

Maven学习(依赖版本维护、依赖传递、解决Maven依赖冲突的3种方式)

时间:2024-12-12 10:01:13浏览次数:10  
标签:依赖 spring jar Maven 版本 servlet

目录

一、Maven的依赖版本维护。

(1)为什么需要依赖版本维护?

(2)依赖统一管理的具体操作步骤。

第一步。在pom.xml文件中使用标签定义jar包的版本。

第二步。在的对应jar的中使用"${}"引入上面定义好的版本。

二、Maven的依赖传递。

(1)什么是Maven依赖传递?

(2)Maven依赖传递引发的问题。

三、解决Maven依赖传递导致的依赖冲突问题。

(1)什么是Maven依赖冲突?

(2)解决依赖冲突的3种方法。

方法1。Maven自提供的调解原则。(自动)

方法2。排除依赖——排除依赖间接传递jar包。

方法3。锁定指定jar包的版本。


  • 本篇博客的内容是涉及Maven的高级特性。
  • Maven的高级特性(模块化、聚合、依赖管理)。本篇博客的主要内容是偏向于Maven的依赖管理。

一、Maven的依赖版本维护。

(1)为什么需要依赖版本维护?
  • Maven是一个项目管理工具。主要作用是在项目开发阶段对项目进行依赖管理和项目构建以及管理插件。
  • POM(Project Object Model)指的是项目对象模型,用来描述当前的Maven项目。它是Maven项目的核心文件。Maven项目的所有依赖都是添加到pom.xml文件里面。

  • 如果pom.xml文件中引入的依赖太多,而各种依赖又有不同的版本。
  • 为了统一维护版本!可以将所有依赖的版本号取出来进行统一管理。具体操作步骤如下。
(2)依赖统一管理的具体操作步骤。
  • 这里使用javax.servlet包下的servlet-api进行演示操作。
  • 先去Maven中央仓库寻找到指定的jar包。


  • 直接复制坐标并引入pom.xml文件。


  • servlet-api2.5坐标
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
  • 第一步。在pom.xml文件中使用<properties>标签定义jar包的版本。
<properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--指定servlet-api版本号-->
        <servlet-api.version>2.5</servlet-api.version>
    </properties>
  • 第二步。在<dependency>的对应jar的<version>中使用"${}"引入上面定义好的版本。
<!--添加依赖-->
    <dependencies>
        
        <!--javax.servlet/servlet-api依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>${servlet-api.version}</version>
            <scope>provided</scope>
        </dependency>
        
    </dependencies>
  • 刷新Maven。查看已添加的依赖!

二、Maven的依赖传递。

(1)什么是Maven依赖传递?
  • 简单的讲:依赖传递就是当我们在项目中引入某个jar包时,所引入的jar包所依赖的jar包也会跟着传递并一起引入进来。

  • 在Maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。

(2)Maven依赖传递引发的问题。
  • 通过下面图可以看到。当我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans、spring-core等。
  • 最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans、spring-core等。


  • 问题:如果我项目需要的spring-core的jar版本不是间接依赖的版本6.2.0。而是需要直接导入指定版本6.1.12该如何解决?
  • 它们之间一起导入的会冲突吗?还是通过其他的方法去解决依赖冲突的问题?下面接着讨论如何解决依赖传递引发的依赖冲突问题!

三、解决Maven依赖传递导致的依赖冲突问题。

(1)什么是Maven依赖冲突?
  • 在项目中同时依赖了多个相同作用的jar。比如spring-aop : 5.0.2和spring-aop : 5.0.5。

  • 当使用Maven引入了Servlet的jar包。且不写<scope>provided</scope>这一行标签。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
</dependency>
  • 当我们把项目部署到tomcat服务器上时,就会报引入的jar包冲突问题!
  • 因为在Tomcat服务器中已经内置了servlet的jar包。所以我们就得给javax.servlet的依赖作用范围设置为provided。表示依赖范围到打包部署为止,这样就能解决这个冲突。


(2)解决依赖冲突的3种方法。
方法1。Maven自提供的调解原则。(自动)
  • 第一声明者优先原则!该原则用于:依赖间接传递jar包之间。在pom.xml文件中,先声明哪个jar包,就以那个jar包为主。
  • 路径近者优先原则!Maven会优先使用自己导入的jar包。依赖中间接传递的jar包排其次 直接依赖高于间接依赖。

方法2。排除依赖——排除依赖间接传递jar包。
  • 在对应的jar包的<dependency>内使用<exclusions>与<exclusion>进行排除指定依赖传递的jar包。
  • 这里拿前面项目pom文件直接引入spring-webmvc依赖时,间接引入依赖spring-core举例。我排除指定的传递依赖(spring-core),再重新指定其版本为6.1.12。
<!--添加依赖-->
    <dependencies>

        <!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>6.2.0</version>
           <!--排除该依赖-->
           <exclusions>
               <exclusion>
                   <groupId>org.springframework</groupId>
                   <artifactId>spring-core</artifactId>
               </exclusion>
           </exclusions>
       </dependency>

       <!--排除后再使用6.1.12spring-core-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
           <version>6.1.12</version>
       </dependency>

    </dependencies>
方法3。锁定指定jar包的版本。
  • 使用标签<dependencyManagement>指定某个jar包的版本是什么。即将jar包版本锁定。但是注意还是需要在<dependencies>与<dependency>内引入依赖,但可以不需要再指定其版本!
<!--依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>6.1.12</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--添加依赖-->
    <dependencies>

        <!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>6.2.0</version>
       </dependency>

       <!--使用6.1.12spring-core-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</artifactId>
       </dependency>

    </dependencies>

标签:依赖,spring,jar,Maven,版本,servlet
From: https://blog.csdn.net/m0_74363339/article/details/144411758

相关文章

  • 说说你对alpha/beta/RC/Release各版本的理解
    在前端开发中,alpha、beta、RC和Release版本代表着软件开发的不同阶段,它们的主要区别在于稳定性、功能完整性和目标用户。Alpha(α)版本:目的:内部测试。主要由开发团队和内部测试人员使用,用于发现和修复主要的bug和功能缺陷。特点:功能可能不完整,存在较多的bug,......
  • 学习笔记067——若依前后端分离版本如何设置主从库
    文章目录1、需求背景2、实现方式2.1、依赖导入2.2、数据源配置2.3、使用1、需求背景项目有时会需要同时访问到两个不同的数据库,来实现数据的处理。2、实现方式例如本人需要主库是:MySQL,从库是Oracle。2.1、依赖导入先在maven依赖中导入Oracle驱动(驱动版本根据自......
  • 内置tomcat依赖
    <tomcat.embed.version>7.0.39</tomcat.embed.version><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-logging-juli</artifactId><scope>provided</scope></depe......
  • 【Java开发】maven概述:构建、依赖管理和项目生命周期
    1.项目开发中的问题1、我的项目依赖一些jar包,我把他们放在哪里?直接拷贝到项目的lib文件夹中?如果我开发的第二个项目还是需要上面的那些jar包,再把它们复制到我当前项目lib中?那如果现在是第三次了,再复制一次吗?以上操作会出现的问题:重复存放jar包;容易出现jar包冲突;手动拷贝jar......
  • Maven、mybatis框架
    一、Maven介绍1.概念:Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。2.为啥使用maven:之前项目中需要引入大量的jar包。这些jar从网上下载,可能下载地址不同意。这些jar之间可能存在冲突。我们应该有一个软件,帮你完成jar的下......
  • Maven项目管理工具详解与应用指南
    1.引子  1.什么是maven?  2.为什么使用maven?  3.如何安装maven软件  4.idea关联本地maven?  5.idea创建maven结构的项目。2.什么是maven?  Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件......
  • maven仓库配置,Tomcat配置,javaweb项目创建
    把maven安装到一个没有中文目录下的文件夹中maven官网下载地址:下载地址:DownloadApacheMaven–Maven配置仓库进入maven文件夹在maven文件夹中创建仓库文件夹(注意不要中文)然后进入conf文件夹中的setting.xml文件打开,找到以下位置添加以下文件,配置阿里云私服<mirror>......
  • Git_版本管理-版本控制
    Git--本地和远程本地--工作区暂存区仓库区WorkingDirectory已修改(modified)workingtreeclean或者Untrackedfiles:Stage已暂存(staged)unstage查看命令:gitls-filesRepository已提交说明(committed)动作:加入--提交-推送发布......
  • CentOS 上下载特定的安装包及其所有依赖包
    在CentOS上下载特定的安装包及其所有依赖包,可以使用yumdownloader工具配合yum。以下是详细步骤:步骤1:安装yum-utils工具yumdownloader是yum-utils包的一部分,需要先安装它:sudoyuminstall-yyum-utils步骤2:启用源并更新缓存确保你的yum源是有效的并更新......
  • Node.js版本管理工具之NVM的安装使用教程
    一、NVM介绍在工作中,不同的项目可能需要不同NodeJS版本,所以维护多个版本比较麻烦,因此NVM(node.jsversionmanagement)应运而生,顾名思义它是一个nodejs的版本管理工具,它可以多版本node并存,轻松切换node版本,下面就开始介绍他的安装配置及使用。二、NVM的下载安装1、NVM下载安......