首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

排查maven 冲突及解决方式

编程知识
2024年09月27日 08:15

Maven

Maven 是一个以项目为中心的自动化构建工具,主要用于Java项目的管理和构建。它提供了一种统一的方式来描述项目的结构、依赖关系和构建过程,简化了项目的构建和管理。

Maven 的主要特点:

  1. 项目对象模型(POM):Maven 使用pom.xml文件来定义项目的依赖、插件和构建配置。POM 是 Maven 项目的核心,描述了项目的基本信息。
  2. 依赖管理:Maven 允许开发者轻松地管理项目所需的库和框架。通过声明依赖,Maven 会自动下载所需的库及其依赖项,解决版本冲突。
  3. 插件体系:Maven 提供了丰富的插件,可以在构建过程中执行各种任务,例如编译代码、打包、运行测试等。
  4. 生命周期管理:Maven 通过定义项目的生命周期来规范构建过程,主要包含清理、编译、测试、打包、部署等阶段。
  5. 多模块项目支持:Maven 支持多模块项目,允许将相关模块组织在同一个项目结构中,方便管理和构建。
  6. 社区支持:Maven 拥有庞大的社区支持,提供了大量的插件和资源,帮助开发者高效开展工作。

1. 常见的依赖冲突报错

1.1、版本冲突报错

[WARNING] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[WARNING] 
[WARNING]   org.apache.commons:commons-lang3:jar:3.4 is referenced from more than one dependency.
[WARNING]     - org.apache.commons:commons-lang3:jar:3.4 (compile)
[WARNING]     - org.apache.commons:commons-lang3:jar:3.5 (compile)

1.2、类找不到或方法找不到

NoClassDefFoundError 或者 ClassNotFoundException或者 NoSuchMethodException

常见但不仅限于以下异常:
java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
或者    
java.lang.NoSuchMethodError: org.apache.commons.lang3.StringUtils.isBlank(Ljava/lang/CharSequence;
 
NoSuchMethodException
依赖冲突可能会间接导致 NoSuchMethodException。例如:
    
不同版本的库:如果项目中引入了同一库的不同版本,Maven 可能会选择一个版本,而这个版本中可能缺少某些方法,从而在运行时导致 NoSuchMethodException。
依赖传递:某些依赖可能会引入其他库的特定版本,如果这些版本之间存在不兼容的方法,也可能导致 NoSuchMethodException。    

1.3、依赖树中的冲突

例如:
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.3.4.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.3.4.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:2.3.4.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.3.4.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.3.4.RELEASE:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] |  |  |  |  +- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] |  |  |  |  \- org.slf4j:slf4j-api:jar:1.7.30:compile
[INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.13.3:compile
[INFO] |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.13.3:compile
[INFO] |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.30:compile
[INFO] |  |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
[INFO] |  |  +- org.springframework:spring-core:jar:5.2.9.RELEASE:compile
[INFO] |  |  |  \- org.springframework:spring-jcl:jar:5.2.9.RELEASE:compile

2、排查maven 依赖是否冲突

2.1、pom 依赖,这里展示部分依赖进行拆解

2.2、使用idea 自带工具进行排查分析:红色的线就表示冲突了。

2.3、使用工具 :maven helper

首先我使用的idea工具,可以安装插件maven helper,

2.4、重启idea
这玩意装好,我们关闭窗口,有可能会叫你restart一下,你就乖乖听话。之后我们打开pom文件并且点击依赖分析。切换到:Dependency Analyzer

3、分析冲突

3.1、点击右键---》Jump to Source 就会跳回到自己的pom 文件(我这跳转到 56 行)

这个时候我们可以一直向下点击,去看 mybatis 3.5.14 依赖路径和 mybatis 3.5.15 冲突依赖路径版本

4、解决办法

总共有四种解决方式:

1,第一声明优先原则

在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效(同个pom.xml文件)。

所以,先声明自己要用的版本的jar包即可。

2,路径近者优先

直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。

3,排除原则

传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。

在pom 文件就会自动生成 排除标识

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.5</version>
            <!-- 排除掉 冲突的 mybatis(3.5.15) -->
            <exclusions>
                <exclusion>
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>

结果:

刷新:先返回去pom 点击刷新,然后在 maven help 里面点击 Refresh UI

最后依赖冲突只剩三个

4,版本锁定原则

在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.14</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

结果:依旧可以排除掉依赖冲突

最后文章有啥不对,欢迎大佬指点!!!
如果感觉对你有帮助就点赞推荐或者关注一下吧!!!

From:https://www.cnblogs.com/blbl-blog/p/18434944
本文地址: http://www.shuzixingkong.net/article/2343
0评论
提交 加载更多评论
其他文章 《HelloGitHub》第 102 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Pytho
《HelloGitHub》第 102 期 《HelloGitHub》第 102 期 《HelloGitHub》第 102 期
救园倒计时:救园最后4天
救园目的:园子这三年困难阶段靠贷款维持,救园是为了还掉贷款,度过难关。救园方式: 终身会员计划,会员,捐助,周边。救园之后,一边增加收入来源,一边加快推进园子的商业化
救园倒计时:救园最后4天
Linux服务器磁盘空间占用情况分析与清理指南
为确保重大节日期间,团队负责的测试环境服务器磁盘不会占用过高,导致频繁报警。我们要求在重大节假日前对服务器磁盘占用情况进行检查。如果发现占用过高,则需人为介入,进行相应清理。 一、检查要求 查看各分区占用情况,如果达到以下任一条件,则需要人为介入判断或处理: (1)磁盘使用率 &gt; 90% (2
【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发
我们创建了一个新的 Windows Dev Center 页面,简化了我们的 Getting Started with WinUI 文档,并与 Visual Studio 合作来改善开发人员在工作负荷和模板方面的体验。
【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发 【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发 【译】通过新的 WinUI 工作负荷和模板改进,深入原生 Windows 开发
从零开始学机器学习——准备和可视化数据
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 数据准备-清洗 在进行机器学习的第一步——准备数据,为了方便起见,我已经提前下载好了所需的文件。 https://files.cnblogs.com/files/guoxiaoyu/US-pumpki
从零开始学机器学习——准备和可视化数据 从零开始学机器学习——准备和可视化数据 从零开始学机器学习——准备和可视化数据
在 ArkTS 中,如何有效地进行内存管理和避免内存泄漏?
ArkTS 是鸿蒙生态的应用开发语言,它在 TypeScript 的基础上进行了优化和定制,以适应鸿蒙系统的需求。 以下是在 ArkTS 中进行有效的内存管理和避免内存泄漏: 1. 使用 const 和 let 合理声明变量: 使用 const 声明那些不会重新赋值的变量,这有助于确保变量的不变性,
深入理解 Nuxt.js 中的 app:error 钩子
title: 深入理解 Nuxt.js 中的 app:error 钩子 date: 2024/9/27 updated: 2024/9/27 author: cmdragon excerpt: 摘要:本文深入讲解了Nuxt.js框架中的app:error钩子,介绍其在处理web应用中致命错误的重要作
深入理解 Nuxt.js 中的 app:error 钩子 深入理解 Nuxt.js 中的 app:error 钩子
Java如何解决同时出库入库订单号自动获取问题
本文简要介绍了在Java中处理同时出库和入库的订单号自动获取问题,通常涉及到多线程环境下的并发控制。为了确保订单号的唯一性和连续性,我们可以使用多种策略,如数据库的自增ID、分布式锁、或者利用Java的并发工具类如`AtomicLong`等。