使用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日

相关文章

  • 教你如何写springboot接口 

    教你如何写Spring Boot接口的完整攻略 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些默认的和约定,使得开发人员可以更加专注于业务逻辑的实现。本文将详细讲解如何使用Spring Boot编写接口,并提供两个示例。 1. 创建Spring Boot…

    Java 2023年5月15日
    00
  • Sprint Boot @Negative使用方法详解

    @Negative是Spring Boot中的一个注解,用于标记一个字段或方法参数必须为负数。在本文中,我们将详细介绍@Negative注解的作用和使用方法,并提供两个示例。 @Negative注解的作用 @Negative注解用于标记一个字段或方法参数必须为负数。当使用@Negative注解标记一个字段或方法参数时,如果该字段或方法参数为非负数,则会抛出j…

    Java 2023年5月5日
    00
  • Spring JDBC 框架简介

    Spring JDBC框架简介 Spring是目前最流行的Java应用程序框架之一,在众多的Spring模块中,Spring JDBC是其中之一。本文将为你详细讲解Spring JDBC框架的概念、特点和使用方法,同时提供两个实例说明。 1. Spring JDBC框架概述 Spring JDBC框架是用轻量级的Java框架Spring来简化Java应用程序…

    Java 2023年6月2日
    00
  • Mybatis如何自动生成数据库表的实体类

    要让Mybatis自动生成数据库表的实体类,需要使用Mybatis Generator这个工具。 下面是使用Mybatis Generator自动生成实体类的详细步骤: 配置generatorConfig.xml文件 在generatorConfig.xml文件中,需要指定要生成的实体类所在的包名、数据库连接信息、要生成的表名等。下面是一个示例配置: &lt…

    Java 2023年5月20日
    00
  • java的Hibernate框架报错“QueryTimeoutException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“QueryTimeoutException”错误。这个错误通常是由于以下原因之一引起的: 查询超时:如果查询需要的时间超过了Hibernate配置文件中设置的查询超时时间,则可能会出现此错误。在这种情况下,需要增加查询超时时间以解决此问题。 数据库连接超时:如果数据库连接超时,则可能会出现此错误。在这种情…

    Java 2023年5月4日
    00
  • springboot结合vue实现增删改查及分页查询

    下面是Spring Boot结合Vue.js实现增删改查和分页查询的攻略: 1. 准备工作 安装Java Development Kit (JDK)及Maven 安装Node.js和Vue CLI 创建Spring Boot项目 2. 引入前端框架 在Spring Boot项目中的pom.xml文件中添加以下依赖: <dependency> &l…

    Java 2023年5月20日
    00
  • 从Spring迁移到Spring Boot的方法步骤

    从Spring迁移到SpringBoot主要需要将项目的配置文件进行改造,主要的改造点是将原来手动配置的部分,改为使用SpringBoot提供的依赖自动配置的机制。下面是从Spring迁移到SpringBoot的方法步骤: 1. 配置文件的改造 SpringBoot采用了约定优于配置的原则,它提供了一些默认的配置,让我们可以快速地启动和搭建项目。因此,在迁移…

    Java 2023年5月15日
    00
  • Java 实战项目之精美物流管理系统的实现流程

    Java 实战项目之精美物流管理系统的实现流程 1. 确定项目需求和功能 一个好的项目必须从需求分析开始。在这个过程中我们需要和客户沟通,了解客户的需求,并根据客户的需求评估项目规模和开发工作量。在此项目中,我们可以分析出以下几个需要实现的功能: 用户登录和权限管理 物流信息管理 货物信息管理 订单信息管理 在线支付 2. 设计数据库结构 在确定了项目需求和…

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