【maven】maven中怎样解决jar包冲突

什么是jar包冲突

maven导入jar包中的一些概念
直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包。
传递依赖:项目中没有直接导入该jar包,可是导入的其他jar包中直接依赖了该jar包,则该jar包可以传递依赖进入此项目中。

项目中如果直接依赖了两个jar包,而这两个jar包同时也直接依赖了同一个jar包,但是两个jar包的并不是一个版本。
例如:
在这里插入图片描述
项目中同时导入了spring-context和spring-webmvc,但是发现这两个 jar 包同时都依赖了 spring-beans。而spring-webmvc 依赖 spirng-beans-4.2.4,spring-context 依赖 spring-beans-5.0.2,最终却是spirng-beans-4.2.4 加入到工程中,而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。

maven中怎样解决jar包冲突

maven工程要导入jar包的坐标,就必须要考虑解决jar包冲突。maven 自动按照下边的原则调解:

解决jar包冲突的方式一: 第一声明优先原则

哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。 先声明的jar包坐标下的依赖包,可以优先进入项目中。

解决jar包冲突的方式二: 路径近者优先原则。

直接依赖路径比传递依赖路径近,那么最终项目进入的jar包会是路径近的直接依赖包。

例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans要比其他依赖传递过来的路径要近。

解决jar包冲突的方式三【推荐使用】: 直接排除法。

可以在直接引用时,添加< exclusions>标签,内部写明排除某个jar包的传递依赖。

例如:依赖 spring-webmvc,但排除 spring-webmvc 所依赖的 spring-beans。
在这里插入图片描述
当我们要排除某个jar包下依赖包,在配置exclusions标签的时候,内部可以不写版本号。因为此时依赖包使用的版本和默认和本jar包一样。

版本锁定

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

如下的配置是锁定了 spring-beans 和 spring-context 的版本:

<!-- 锁定jar包版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.0.2.RELEASE</version>
            </dependency>
            <dependency>
            	<groupId>org.springframework</groupId>
            	<artifactId>spring-beans</artifactId>
            	<version>5.0.2.RELEASE</version>
        	</dependency>
        </dependencies>
    </dependencyManagement>

当然也可以使用< properties>标签,将版本号提取出来统一管理:

<!-- 统一管理jar包版本 -->
    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>
    <!-- 锁定jar包版本 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
            	<groupId>org.springframework</groupId>
            	<artifactId>spring-beans</artifactId>
            	<version>${spring.version}</version>
        	</dependency>
        </dependencies>
    </dependencyManagement>

注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加< dependencies>< /dependencies>标签,如下:
在这里插入图片描述
上边添加的依赖并没有指定版本,原因是已在中锁定了版本,所以在< dependency>下不需要再指定版本。

参考博客:Maven中jar包冲突原理与解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值