使用maven工具解决jar包冲突或重复加载的问题

使用 Maven 工具可以有效地解决 Java 项目中 Jar 包冲突或者重复加载的问题。接下来,我会详细讲解如何使用 Maven 工具来解决这个问题的完整攻略。

1. Maven依赖冲突的解决

Maven 场景中,当我们引用的多个 Jar 包中存在重复的类或者接口时,会出现冲突。这种冲突情况下,只有部分功能可以使用,或者无法正常使用。

为了解决这个问题,我们可以通过以下两种方式进行解决:

1.1 排除冲突依赖包

  • 通过查看依赖树,分析出存在冲突的 Jar 包
  • 在引用较多的 Jar 包时,我们可以增加以下配置项,然后再重新运行 mvn clean install 命令即可。此配置会排除掉一个 POM 文件中指定的依赖:
<dependency>
  <groupId>xxx</groupId>
  <artifactId>xxx</artifactId>
  <version>x.x.x</version>
  <exclusions>
    <exclusion>
      <groupId>xxx</groupId>
      <artifactId>xxx</artifactId>
    </exclusion>
  </exclusions>
</dependency>

示例:

引入了两个版本不同的common-collections的依赖包,其中一个包(版本3.1)是由a依赖而来,另一个包(版本4.1)是由b依赖而来。而使用的是版本为3.1的common-collections。这样就会出现样例如下的冲突问题:

<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxx-a</artifactId>
    <version>x.x.x</version>
    <exclusions>
        <exclusion>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxx-b</artifactId>
    <version>x.x.x</version>
    <exclusions>
        <exclusion>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.1</version>
</dependency>

我们可以选择通过 mvn dependency:tree 命令查看冲突的依赖。排除掉b的commons-collections,留下a的即可。

<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxx-a</artifactId>
    <version>x.x.x</version>
    <exclusions>
        <exclusion>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxx-b</artifactId>
    <version>x.x.x</version>
    <exclusions>
        <exclusion>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>4.1</version>
</dependency>

1.2 使用Jar包的最新版本

当我们引用的多个 Jar 包中存在相同的类或者接口时,若需要使用某个 Jar 包的类或接口时,可以将其改为使用 Jar 包的最新版本。

在引用 Jar 包的依赖时,我们可以使用以下配置项,在 POM.xml 中引用依赖的 Jar 包时,使用 latest 关键字来引入 Jar 包最新版本。

<dependency>
  <groupId>xxx</groupId>
  <artifactId>xxx</artifactId>
  <version>latest</version>
  <type>jar</type>
</dependency>

示例:

引入了两个版本不同的fastjson的依赖包,我们选择使用最新版本的fastjson:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

将版本修改为 latest 即可:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>latest</version>
</dependency>

2.解决依赖Jar包重复加载的问题

当出现依赖包重复加载时,我们可以使用 Maven 的 exclusions 属性来解决该问题。这里我们以 Spring 框架为例介绍。

1.打开 pom.xml 配置文件,找到依赖的父级项目

2.找到父级项目的依赖配置parent下的标签,并在其中找到冲突的依赖

3.在有依赖冲突的 submodule 中,通过在依赖的配置中添加 exclusions 属性排除依赖。

<dependency>
    <groupId>xxx</groupId>
    <artifactId>xxx</artifactId>
    <version>x.x.x</version>
    <exclusions>
        <exclusion>
            <groupId>xxx</groupId>
            <artifactId>xxx</artifactId>
        </exclusion>
    </exclusions>
</dependency>

示例:

在Maven的Spring框架场景中,JdbcTemplate和spring-webmvc使用了两次,因此冲突:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.3.5.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.5.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

我们可以通过在 spring-boot-starter-jdbc 依赖和 spring-boot-starter-web 依赖的 exclusions 标签中,排除掉 spring-jdbcspring-webmvc 依赖,解决这个问题。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <version>2.3.5.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.5.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

以上就是使用 Maven 工具解决 Jar 包冲突或重复加载问题的解决方案和示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用maven工具解决jar包冲突或重复加载的问题 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    下面来详细讲解“Spring Boot整合MyBatis使用注解实现动态SQL、参数传递等常用操作(实现方法)”的完整攻略,包括以下几个方面: 环境准备: 在使用MyBatis前,需要包含所需的依赖包,这里我们将使用Maven管理依赖进行配置。在pom.xml文件中添加以下代码: <dependency> <groupId>org.m…

    Java 2023年5月20日
    00
  • java 读取本地文件实例详解

    Java 读取本地文件实例详解 1. 读取文本文件 1.1 创建文件对象 首先,需要创建一个 File 对象来表示本地文件。下面是创建 file.txt 文件的示例代码。 // 创建 File 对象 File file = new File("file.txt"); 如果文件不在当前项目的工作目录中,则需要提供文件的完整路径。 1.2 读…

    Java 2023年5月20日
    00
  • Java入门6(String和封装类)

    使用第三方jar包,完成get/set操作 Lombok,结合特殊的注解,实现setter和getter的自动生成 导入jar包 使用插件Lombok 在类里import 即可使用 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; //…

    Java 2023年4月19日
    00
  • java中实现map与对象相互转换的几种实现

    当我们需要将Java中的Map和对象进行相互转换时,可以使用以下几种实现方法: 方法一:手动转换 手动将Map中的键值对映射到Java Bean中的字段,并反之。这种方法的实现相对比较简单,但是存在缺陷是需要手动对属性进行处理,比较繁琐,不够自动化 public class User { private Long id; private String nam…

    Java 2023年5月26日
    00
  • Java通过jersey实现客户端图片上传示例

    下面是实现“Java通过jersey实现客户端图片上传示例”的攻略。 准备工作 确保已经安装好Java开发环境和Maven。 在Maven中加入Jersey的依赖,例如: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-serv…

    Java 2023年5月19日
    00
  • springmvc如何进行异常处理

    Spring MVC可以通过统一的异常处理机制来处理应用程序中遇到的异常,统一处理异常可以使应用程序更加健壮,并且在开发过程中可以统计异常信息,方便排查错误。 Spring MVC框架中异常处理是通过HandlerExceptionResolver接口来处理的,在这个接口中我们可以自定义异常处理的方式,这个接口中有两个非常重要的方法:resolveExcep…

    Java 2023年5月27日
    00
  • SpringMVC JSON数据交互实现过程解析

    SpringMVC JSON数据交互实现过程解析 在 SpringMVC 中,我们可以使用 JSON 数据格式来进行数据交互。本文将详细讲解 SpringMVC JSON 数据交互实现过程的原理和步骤,包括如何使用 @RequestBody 注解来接收 JSON 数据、如何使用 MappingJackson2HttpMessageConverter 来将 J…

    Java 2023年5月18日
    00
  • 一篇文章带你学习JAVA MyBatis底层原理

    一篇文章带你学习JAVA MyBatis底层原理 MyBatis是一个基于Java的ORM框架,它可以将数据库记录映射成对象,屏蔽了大部分的JDBC操作。文章将带你深入了解MyBatis底层原理。我们将分以下四个部分:解析MyBatis类结构、解析MyBatis配置文件、解析Mapper映射文件、MyBatis执行流程。 解析MyBatis类结构 MyBat…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部