用Maven定位和解决依赖冲突

用Maven定位和解决依赖冲突

      • 一、依赖冲突的常见表现
      • 二、定位冲突依赖的4种方法
        • 2.1 使用Maven命令分析依赖树
        • 2.2 使用IDE可视化工具
        • 2.3 使用Maven Enforcer插件
        • 2.4 运行时分析
      • 三、解决依赖冲突的5种方案
        • 3.1 排除特定传递依赖
        • 3.2 统一指定版本(推荐)
        • 3.3 使用dependencyManagement
        • 3.4 强制指定版本
        • 3.5 重构依赖结构
      • 四、实战案例:解决Log4j冲突
      • 五、预防依赖冲突的最佳实践
        • 5.1 定期执行依赖检查
        • 5.2 使用BOM统一版本
        • 5.3 分层管理依赖
        • 5.4 使用依赖分析工具
      • 六、常见依赖冲突场景解决方案

一、依赖冲突的常见表现

表现说明
ClassNotFoundException类文件存在但版本不兼容
NoSuchMethodError方法签名在不同版本中不一致
NoClassDefFoundError依赖的依赖缺失
Unexpected Behavior不同版本类实现的差异导致逻辑错误

二、定位冲突依赖的4种方法

2.1 使用Maven命令分析依赖树
# 查看完整依赖树
mvn dependency:tree# 过滤指定依赖(示例查找guava)
mvn dependency:tree -Dincludes=com.google.guava:guava

示例输出

[INFO] com.example:my-project:jar:1.0.0
[INFO] +- com.moduleA:moduleA:jar:2.0:compile
[INFO] |  \- com.google.guava:guava:jar:30.0-jre:compile
[INFO] \- com.moduleB:moduleB:jar:3.1:compile
[INFO]    \- com.google.guava:guava:jar:31.0.1-jre:compile
2.2 使用IDE可视化工具
  • IntelliJ IDEA:右键pom.xml > Maven > Show Dependencies
  • Eclipse:右键项目 > Maven > Show Dependencies
2.3 使用Maven Enforcer插件
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-enforcer-plugin</artifactId><version>3.0.0</version><executions><execution><id>enforce</id><goals><goal>enforce</goal></goals><configuration><rules><dependencyConvergence/></rules></configuration></execution></executions></plugin></plugins>
</build>

冲突时输出

Dependency convergence error for com.google.guava:guava:31.0.1-jre paths to dependency are:
+-com.example:my-project:1.0.0+-com.moduleA:moduleA:2.0+-com.google.guava:guava:30.0-jreand
+-com.example:my-project:1.0.0+-com.moduleB:moduleB:3.1+-com.google.guava:guava:31.0.1-jre
2.4 运行时分析
public class DependencyChecker {public static void main(String[] args) {System.out.println("Guava版本: " + com.google.common.base.Strings.class.getPackage().getImplementationVersion());}
}

三、解决依赖冲突的5种方案

3.1 排除特定传递依赖
<dependency><groupId>com.moduleB</groupId><artifactId>moduleB</artifactId><version>3.1</version><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions>
</dependency>
3.2 统一指定版本(推荐)
<properties><guava.version>31.0.1-jre</guava.version>
</properties><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency>
</dependencies>
3.3 使用dependencyManagement
<dependencyManagement><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency></dependencies>
</dependencyManagement>
3.4 强制指定版本
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><argLine>-Dguava.version=31.0.1-jre</argLine></configuration></plugin></plugins>
</build>
3.5 重构依赖结构
<!-- 将共同依赖提升到父POM -->
<dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency>
</dependencies>

四、实战案例:解决Log4j冲突

初始依赖配置

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.3</version></dependency>
</dependencies>

冲突分析

mvn dependency:tree -Dincludes=org.apache.logging.log4j

输出显示

+- org.apache.hadoop:hadoop-common:3.3.1
|  \- org.apache.logging.log4j:log4j-slf4j-impl:2.14.1
\- org.springframework.boot:spring-boot-starter-web:2.6.3\- org.springframework.boot:spring-boot-starter-logging:2.6.3\- org.apache.logging.log4j:log4j-to-slf4j:2.17.1

解决方案

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.1</version><exclusions><exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.17.1</version>
</dependency>

五、预防依赖冲突的最佳实践

5.1 定期执行依赖检查
mvn versions:display-dependency-updates
5.2 使用BOM统一版本
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.3</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
5.3 分层管理依赖
project-root
├── pom.xml            # 父POM管理公共配置
├── service-module     # 业务模块
└── web-module         # Web模块
5.4 使用依赖分析工具
  • Maven Dependency Analyzer
  • JDepend

六、常见依赖冲突场景解决方案

冲突场景解决方案示例
SLF4J多绑定排除冲突实现排除logback-classic保留log4j-slf4j
Jackson版本差异统一指定版本强制使用2.13.1
Spring不同模块版本使用BOM管理spring-boot-dependencies
Servlet API冲突设置provided scope使用Tomcat提供运行时依赖

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

穿越数据森林与网络迷宫:树与图上动态规划实战指南

在 C 算法的浩瀚宇宙中&#xff0c;树与图就像是神秘的迷宫和茂密的森林&#xff0c;充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘&#xff0c;帮助我们找到最优路径。今天&#xff0c;就让我们一起深入这片神秘领域&#xff0c;揭开树与图上动态规划的神秘面纱&am…

UDP / TCP 协议

目录 一、前言&#xff1a; 数据封装与分用&#xff1a; 二、网络协议分层模型&#xff1a; 三、UDP / TCP 协议 UDP 协议&#xff1a; 1、UDP 协议段格式&#xff1a; 2、UDP 的特点&#xff1a; TCP 协议&#xff1a; 1、TCP 协议段格式&#xff1a; 2、TCP 协议的十…

Python 实现的运筹优化系统数学建模详解(动态规划模型)

相关代码链接&#xff1a;https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在计算机科学与数学建模的广阔领域中&#xff0c;算法如同精密的齿轮&#xff0c;推动着问题的解决与系统的运行。当面对复杂的优化问题时&…

langfuse本地安装

目录 安装命令项目准备用openai测试 安装命令 本地&#xff08;docker compose&#xff09;&#xff1a;使用 Docker Compose 在你的机器上于 5 分钟内运行 Langfuse。 # 获取最新的 Langfuse 仓库副本 git clone https://github.com/langfuse/langfuse.git cd langfuse# 运行 …

每天学一个 Linux 命令(35):dos2unix

每天学一个 Linux 命令(35):dos2unix 命令简介 dos2unix 是一个用于将 Windows/DOS 格式的文本文件转换为 Unix/Linux 格式的实用工具。它主要处理行尾符的转换(将 CRLF 转换为 LF),同时也能处理编码问题和字符集转换。这个命令在跨平台文件共享、代码迁移和系统管理场…

第6章 Python 基本数据类型详解(int, float, bool, str)细节补充

文章目录 Python 基本数据类型深入解析(int, float, bool, str)一、整型(int)的底层机制二、浮点型(float)的陷阱与解决方案三、布尔型(bool)的底层本质四、字符串(str)的不可变性与优化五、类型间的隐式转换与陷阱六、性能优化与工具总结:关键细节与最佳实践Python…

19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?

引言&#xff1a;当AI成为企业"数字员工"时的责任边界 2025年某金融机构因AI客服泄露用户信用卡信息被罚款2300万美元。本文将基于LangChain的安全架构与Deepseek-R1的合规实践&#xff0c;揭示如何构建既强大又安全的AI系统。 一、AI安全风险矩阵 1.1 2025年最新威…

Java快速上手之实验六

1. 编写ItemEventDemo.java&#xff0c;当选中或取消选中单选钮、复选钮和列表框时显示所选的结果。 2&#xff0e;编写GUIExample.java&#xff0c;当选中或取消选中单选钮、复选钮时在标签中显示相应结果。 import javax.swing.*; import java.awt.*; import java.awt.event.…

QT6 源(72):阅读与注释单选框这个类型的按钮 QRadioButton,及各种属性验证,

&#xff08;1&#xff09;按钮间的互斥&#xff1a; &#xff08;2&#xff09;源码来自于头文件 qradiobutton . h &#xff1a; #ifndef QRADIOBUTTON_H #define QRADIOBUTTON_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qabstractbutton.h>…

【算法滑动窗口】 将x减到0的最小操作数

将x减到0的最小操作数 个人总结的八步归纳AI的归纳**8步归纳法&#xff08;极简直白版&#xff09;**1. 问题本质2. 问题特征3. 切入点4. 解决流程5. 每步目标与操作6. 注意事项7. 最终目标8. 整体总结 代码对照&#xff08;逐行解析&#xff09;举个栗子&#x1f330;**一句话…

RISC-V GPU架构研究进展:在深度学习推理场景的可行性验证

一、新型算力架构的突围战 在英伟达CUDA生态主导的GPU市场中&#xff0c;RISC-V架构正以‌开源基因‌和‌模块化设计‌开辟新赛道。当前主流GPU架构面临两大痛点&#xff1a; 指令集封闭性‌&#xff1a;NVIDIA的SASS指令集与AMD的GCN/RDNA架构均采用私有指令编码&#xff0c…

LVGL -滑动条

1 滑动条 LVGL 的滑动条(Slider)是一个非常有用的控件,允许用户通过拖动滑块或点击滑条来选择一个值。 1.1 基本定义 滑动条允许用户在一个预定义的数值范围内选择一个特定的值。它通常由一个轨道(track)和一个滑块(thumb)组成。用户可以通过点击或拖动滑块来调整数值。…

ROS2学习笔记|Python实现订阅消息并朗读的详细步骤

本教程将详细介绍如何使用 ROS 2 实现一个节点订阅另一个节点发布的消息&#xff0c;并将接收到的消息通过 espeakng 库进行朗读的完整流程。以下步骤假设你已经安装好了 ROS 2 环境&#xff08;以 ROS 2 Humble 为例&#xff09;&#xff0c;并熟悉基本的 Linux 操作。 注意&…

WPF封装常用的TCP、串口、Modbus、MQTT、Webapi、PLC通讯工具类

WPF封装常用通讯工具类 下面我将为您封装常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通讯工具类,适用于WPF应用程序开发。 一、TCP通讯工具类 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …

npm pnpm yarn 设置国内镜像

国内镜像 常用的国内镜像&#xff1a; 淘宝镜像 https://registry.npmmirror.com 腾讯云镜像​​ https://mirrors.cloud.tencent.com/npm/ 华为云镜像​​ https://repo.huaweicloud.com/repository/npm/ CNPM&#xff08;阿里系&#xff09; ​​ https://r.cnpmjs.org/ 清华…

P4552 [Poetize6] IncDec Sequence 题解

P4552 [Poetize6] IncDec Sequence - 洛谷 差分贪心 根据题目&#xff1a;一段区间都加1或减1 &#xff0c; 可以想到差分 构建差分数组&#xff1a;sub 我们要让除了sub[1] , 其他全是0 我们可以的操作是&#xff1a;l1 , r-1 or l-1 , r1 or 一个数1 / -1 所…

Power Query精通指南2:数据转换——透视/逆透视/分组、横向纵向合并数据、条件判断、处理日期时间

文章目录 七、常见数据转换7.1 逆透视7.1.1 逆透视操作7.1.2 重建透视表&#xff0c;更新数据7.1.3 三种逆透视方式&#xff08;逆透视列等价于逆透视其他列&#xff09; 7.2 透视7.3 拆分列7.3.1 将列拆分为多列7.3.2 将列拆分为多行7.3.3 拆分到列后逆透视&#xff08;保留列…

使用线性表实现通讯录管理

目录 &#x1f680;前言&#x1f99c;任务目标&#x1f31f;顺序表实现&#x1f40d;链表实现 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介绍线性表的实验&#xff0c;使用顺序表和链表实现通讯录管理&#xff0c;包含初始化、插入、删除、查询、输出。 &a…

firewall docker 冲突问题解决(亲测有效)

# 关闭iptables&#xff0c;使用firewall systemctl disable iptables # 禁用服务 systemctl stop iptables # 关闭服务 systemctl status iptables # 查看服务状态 systemctl enable firewalld # 设置防火墙开机自启动 systemctl start firewalld # 开启服务 systemctl s…

[250428] Nginx 1.28.0 发布:性能优化、安全增强及新特性

目录 Nginx 1.28.0 稳定版发布主要亮点包括&#xff1a;功能增强&#xff1a;安全性改进&#xff1a;其他&#xff1a; Nginx 1.28.0 稳定版发布 Nginx 官方于 4 月 24 日发布了最新的 1.28.0 稳定版本。此版本基于之前的 1.27.x 主线分支&#xff0c;整合了多项新功能、性能优…