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

yizhihongxing

使用 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基于通用Dao的多数据源配置详解

    以下是对“spring基于通用Dao的多数据源配置详解”的完整攻略。 一、背景 在开发Java Web应用时,经常需要使用多个数据源来存储不同的业务数据。而Spring框架提供了多数据源的支持,通过配置多个数据源并使用通用Dao可以让我们更加方便和高效地实现多数据源的管理。 二、实现步骤 1. 导入依赖 在pom.xml文件中添加以下依赖: <!–通…

    Java 2023年6月3日
    00
  • 详解Java如何实现数值校验的算法

    详解Java如何实现数值校验的算法 在Java中,数值校验是非常重要的一个操作。在开发过程中保证输入的数据的正确性非常关键,因此数值校验也是开发过程中经常需要用到的一项技术。下面我们将详细讲解如何实现数值校验的算法。 算法概述 数值校验的算法可以分为两类,分别是正则表达式和Java提供的API。 正则表达式实现 正则表达式是一种字符串匹配的技术,利用正则表达…

    Java 2023年5月19日
    00
  • javaweb中Filter(过滤器)的常见应用

    下面是“javaweb中Filter(过滤器)的常见应用”的完整攻略。 一、Filter(过滤器)的简介 Filter(过滤器)是JavaWeb中的一种动态Web组件,它可以拦截客户端和服务器之间的请求、响应,对它们进行预处理和后处理,从而起到了对请求和响应进行过滤的作用。 Filter(过滤器)位于请求和响应之间,可以截获客户端请求和服务器响应,Filte…

    Java 2023年5月20日
    00
  • java 获取冒号后面的参数(正则)实现代码

    获取冒号后面的参数可以使用正则表达式进行匹配。以下是一个实现代码的完整攻略: 首先,我们需要从文本中匹配出所有的冒号后面的参数,可以使用正则表达式来完成。Java中使用Pattern类和Matcher类来完成正则表达式的匹配。 正则表达式的模式应该为冒号后面的任意字符,可以使用“:.+”表示,其中“:”表示冒号,“.”表示匹配任意字符,“+”表示匹配前面的字…

    Java 2023年6月15日
    00
  • 使用idea开发javaWeb应用程序的思路(实现用户的增删改查)

    下面我从以下几个方面来详细讲解使用Idea开发JavaWeb应用程序的思路,实现用户的增删改查: 环境准备 首先我们需要准备好Java开发环境和Web容器,推荐使用JDK8和Tomcat8。然后我们需要安装Idea开发工具。 创建JavaWeb项目 在Idea中创建一个JavaWeb项目,选择Web Application模板,并勾选Web.xml文件。创建…

    Java 2023年6月15日
    00
  • 解决SpringSecurity 一直登录失败的问题

    对于SpringSecurity一直登录失败的问题,我们可以从以下几个方面来进行排查和解决。 1.检查用户名和密码是否正确 登录失败的常见原因之一是用户名和密码不正确。我们可以通过查看用户表或者日志来检查用户输入的用户名和密码是否与系统中保存的用户名和密码匹配。如果不匹配,则登录失败。另外,如果程序使用了加密算法对密码进行加密,我们还需要检查用户输入的密码是…

    Java 2023年5月20日
    00
  • Java 发送http请求上传文件功能实例

    以下是Java发送HTTP请求上传文件的完整攻略,包含示例代码、步骤以及解释。 1. 前置准备 在进行Java发送HTTP请求上传文件之前,我们需要先做一些前置准备,具体如下: 下载安装Java开发环境。 学习Java基础知识,如I/O流、网络编程等。 学习使用Java HttpURLConnection类发送HTTP请求。 2. 发送HTTP请求上传文件的…

    Java 2023年5月19日
    00
  • 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    如果在启动Tomcat时出现“错误: 代理抛出异常: java.rmi.server.ExportException: Port already in use: 1099”的错误,意味着端口1099已经被占用了。一般是因为其他应用程序或Tomcat已经在使用该端口,导致Tomcat无法使用。 解决该问题的方法有两种,一种是找到占用了端口1099的应用程序并关…

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