首页 > 其他分享 >排查maven 冲突及解决方式

排查maven 冲突及解决方式

时间:2024-09-27 09:12:25浏览次数:8  
标签:INFO compile 依赖 jar maven 排查 冲突 org Maven

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>

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

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

标签:INFO,compile,依赖,jar,maven,排查,冲突,org,Maven
From: https://www.cnblogs.com/blbl-blog/p/18434944

相关文章

  • 排查慢收口问题及优化慢查询方法
    目录排查慢收口问题及优化慢查询方法一、开启慢SQL查询日志二、使用explain分析SQL执行计划三、利用其他监控工具在实际的线上环境中,慢收口问题是经常会碰到的。下面为大家总结了排查和优化慢查询的方法:一、开启慢SQL查询日志在数据库层面,开启慢SQL查询日......
  • Axure解决列表项中"触发内部元件交互"的冲突问题
    背景在绘制列表项中“更多”菜单按钮的时候,我想在我鼠标悬浮上去时会出现一个底色的效果如下图:但我在做的过程中发现如果在一个组下勾选了"触发内部元件鼠标交互样式",那你鼠标还没放到"更多"按钮上就已经给触发了制作过程1、所需元件2、结构3、只需要在"更多"这个......
  • redis自身查询很慢 排查redis-benchmark
    redis-benchmark 是一个用于测试Redis性能的基准测试工具,可以帮助开发人员评估和比较Redis在不同配置或负载情况下的吞吐量和延迟。通过 redis-benchmark 的测试结果,你可以获得qps、平均延迟、错误率等性能指标,从而根据需要进行调优和优化,确保Redis在实际生产环境中具有良......
  • linux主机入侵排查 爆破登录
    一、系统排查分析1.用户信息的排查#查看用户和密码cat/etc/shadowcat/etc/passwd#查看组信息cat/etc/group#查看历史命令history#查看最近登录成功的用户及信息last#查看主机所有用户最近一次登录信息lastlog#查看当前用户信息id#查看当前登录系统......
  • PostgreSQL慢SQL的定位排查方法例子解析
    代码示例:定位和排查PostgreSQL中的慢SQL查询是一个系统性的工作,通常涉及多个步骤和工具。以下是一个详细的排查流程示例:启用慢查询日志:首先,你需要确认慢查询日志是否已经开启。可以通过查询pg_settings视图来检查log_min_duration_statement的值。如果该值为-1,则表示慢......
  • Maven中的配置文件
    在使用Maven进行项目管理时,合理配置settings.xml文件可以显著提高开发效率。1.找到maven对应的settings.xml文件我是使用IDEA自带的maven。就算是自己下载的maven,操作也是一样的,先找到setting文件。2.配置镜像资源为了加快依赖下载速度,可以配置国内的镜像资源。以下......
  • 达梦空格填充导致违反唯一约束问题排查及处理
    在oracle迁移到达梦过程中,创建主键提示违法唯一约束。如下所示:用户反馈没有重复数据原因是达梦空格填充模式参数(BLANK_PAD_MODE)为0 , 查询语句将忽略字符串的后缀空格,由于大部分其他都已经迁移过去,只有个别表报错,不能重新初始化实例,需要将有问题的数据查找出来删除查找重......
  • connect timed out 详解及排查
    在HTTP通信中,超时(timeout)机制用于限制客户端等待服务器响应的时间,避免因网络、服务器问题导致客户端长时间等待。超时的类型多种多样,每种类型的超时都会有对应的错误信息。以下是常见的ConnectTimeout问题的原因排查和解决方案。HTTP中的各种Timeout详解及对应的错误信息......
  • 【随手记录】docker部署jenkins,集成maven、spring项目
    1、下载镜像文件到服务器dockerpulljenkins/jenkins:lts-jdk17或离线导入镜像:dockerload-ijenkins-lts-jdk17检查镜像是否导入:dockerimages|grepjenkinsjenkins/jenkinslts-jdk177a7add0bf3da2weeksago470MB2024年6月以后国内很多大型的Dock......
  • 精通Maven:多模块项目中的依赖管理
    Maven是一个强大的项目管理和构建工具,但它的真正力量在于其依赖管理能力。在本文中,我将分享一些关键步骤和最佳实践,以及一些高级技巧,帮助你掌握Maven多模块项目中的依赖管理。Maven多模块项目基础在深入讨论之前,让我们先了解什么是Maven多模块项目。Maven项目可以被组织成多......