关于什么是Maven“依赖传递”、“依赖冲突”,Java程序员有话说!

开发实战|Maven中的依赖传递详解 在Maven中,依赖通过<dependency>标签在项目的pom.xml文件中声明,并且可以通过标签来控制依赖的作用范围。依赖传递是基于依赖树实现的,如果A依赖于B,而B又依赖于C,则A也间接依赖于C。然而,这种依赖传递可能会受到依赖版本冲突、作用范围等因素的影响。本篇就是一个scope后续,主要理解下什么是传递依赖、如何设置、如何避免传递依赖,希望通过以上方法,可以有效地管理和解决 Maven 依赖传递冲突问题,让你在编码时运用自如。欢迎关注博主「六月暴雪飞梨花」或加入【六月暴雪飞梨花社区】 阅读详情

在这里插入图片描述

什么是依赖传递?

在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C,假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。

什么是依赖冲突?

大家都要用到一个工具包,由于依赖传递大家都会导入,发现大家导入的工具包版本不统一,就产生了冲突

eg: spring-webmvc-5.3.3依赖spring-beans-5.3.3,而spring-aop-5.0.2依赖spring- beans-5.0.2,但是发现spring-bean-5.0.2加入到了工程中,而我们希望spring-beans-5.3.3加入工程。这就造成了依赖冲突

如何解决依赖冲突

1. 使用maven提供的依赖调解原则

1)第一声明者优先原则

在pom文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖,不好用,不推荐

2)路径近者优先原则

在pom文件定义依赖,以路径近者为准。

还是上述情况,spring-aop和spring-webmvc都会传递过来spring-beans,那如果直接把spring-beans的依赖直接写到pom文件中,那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近

2.排除依赖

可以使用exclusions标签将传递过来的依赖排除出去

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.3</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3.锁定版本

采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径以锁定的版本为准添加到工程中

版本锁定的使用方式:
第一步:在dependencyManagement标签中锁定依赖的版本
第二步:在dependencies标签中声明需要导入的maven坐标

1)在dependencyManagement标签中锁定依赖的版本

<!--依赖jar包版本锁定-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.3.RELEASE</version>
        </dependency>
        <dependency>
           <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.3.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

**注意:**pom文件中使用dependencyManagement标签进行依赖jar的版本锁定,并不会真正将jar包导入到项目中,只是对这些jar的版本进行锁定。项目中使用哪些jar包,还需要在dependencies标签中进行声明。

2)在dependencies标签中声明需要导入的maven坐标

<dependencies>
   <!-- 由于前面已经在dependencyManagement标签中锁定了spring-bean和spring-context的版本,
    此处只需要导入groupdId和artifactId即可,无需再指定version-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
</dependencies>

eg:

分类: [maven]
在这里插入图片描述

IntelliJ报错「Cannot resolve symbol」:Maven依赖冲突与索引重建的快速修复 在Java开发中,IntelliJ IDEA的「Cannot resolve symbol」错误是高频问题,通常由Maven依赖冲突、IDE缓存异常或项目配置错误引发。本文结合优快云社区的实战经验与开源项目案例,系统性解析依赖冲突定位、版本仲裁规则及索引重建方案,并提供完整代码示例与操作流程。 阅读详情

相关推荐

Maven 依赖冲突调解与版本控制

Maven将项目的依赖关系建模为有向无环图(DAG),每个节点代表一个构件(artifact),边表示依赖关系。当出现版本冲突时,Maven会优先选择距离根节点(当前项目)路径最短的版本。这个看似简单的规则背后,隐藏着深刻的图论原理。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1397

提供可传递的易受攻击的依赖项 maven:org.yaml:snakeyaml:1.33

警告信息: 提供可传递的易受攻击的依赖项 maven:org.yaml:snakeyaml:1.33。

青云的博客 4408

Java 领域 Maven 的依赖冲突的根本原因分析

本文旨在全面剖析Java项目中使用Maven作为构建工具时遇到的依赖冲突问题。我们将从技术原理层面深入分析依赖冲突产生的根本原因,而不仅仅是停留在表面现象的解决。Maven依赖管理的基本机制依赖冲突的类型和表现形式冲突产生的深层次技术原因系统性的解决方案和预防措施首先介绍Maven依赖管理的基本概念和机制然后分析依赖冲突的具体表现和分类接着深入探讨冲突产生的根本技术原因随后提供实际案例和解决方案最后总结最佳实践和未来发展趋势。

Java大师兄的博客 1107

maven的依赖传递及其解决maven依赖冲突

什么是依赖传递 先添加 springmvc 的核心依赖的坐标 会发现出现除了 spring-webmvc 以外的其他 jar。因为我们的项目依赖 spring-webmv.jar,而 spring-webmv.jar 会依赖 spring-beans.jar 等等,所以 spring-beans.jar 这些 jar 包也出现在了我 们的 maven 工程中,这种现象我们称为依赖传递。从下图中...

weixin_43152758的博客 852

Java 中 Maven 依赖冲突的解决策略

本文旨在全面介绍 Java 中 Maven 依赖冲突的相关知识和解决方法。我们将从依赖冲突的基本概念入手,深入分析其产生的原因和可能出现的表现形式。然后,详细阐述多种解决依赖冲突的策略,包括依赖排除、版本锁定、依赖调解原则等。为了让读者更好地理解和应用这些策略,我们还会提供实际的代码案例和详细的分析。本文的范围涵盖了 Maven 依赖冲突的各个方面,适用于使用 Maven 进行 Java 项目开发的开发者。核心概念与联系:介绍 Maven 依赖的基本概念、依赖冲突的定义和产生原因。

Java大师兄的博客 1042

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6230

Maven依赖详解

一、依赖 依赖是Maven 中最关键的部分,我们之所以在工程中使用Maven,就是因为它的依赖管理功能。如果我们想要在工程中引入某个jar 包,只需要在pom.xml 中引入其jar 包的坐标即可。比如引入log4j 的依赖: <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</a

m0_67392182的博客 6914

从一个过气考渣的角度看LLM智能化测试用例生成

根据业务需求生成测试用例,会涉及到相关上下文的召回、用例生成等场景。除了用例生成之外,也可以考虑应用LLM进行用例评审。因此,本文将涉及以下内容。

software_test010的博客 830

Maven依赖传递和依赖冲突以及继承和聚合关系详解

Java全能学习+面试指南:https://javaxiaobear.cn

Java全能学习+面试指南 1241

大模型训练方法全面解析:SFT、RFT、TRPO、DPO、PPO、GRPO、RLH、RLHF技术深度剖析

大模型训练方法全面解析 本文系统介绍了当前主流的大模型训练和对齐技术,包括监督微调(SFT)、拒绝采样微调(RFT)、信任域策略优化(TRPO)、直接偏好优化(DPO)、近端策略优化(PPO)等。这些方法各有特点:SFT简单高效但数据依赖性强;RFT通过质量筛选提升输出质量;TRPO训练稳定但计算复杂;PPO是RLHF核心算法,平衡探索与利用。文章详细分析了各方法的实现原理、优势劣势及适用场景,为开发者选择合适的大模型训练策略提供参考。

2799

【Maven】006-Maven 依赖传递和依赖冲突

Maven 依赖传递是指当一个项目依赖于另一个项目或库时,Maven 会自动解析和获取这些依赖,确保项目能够顺利构建和运行。依赖传递包括直接依赖和间接依赖。直接依赖是项目直接引用的库,而间接依赖是直接依赖所引用的其他库。作用:简化项目管理:Maven 通过依赖传递简化了项目的管理,开发者只需声明直接依赖,Maven 会负责解析和获取所有的间接依赖。版本控制:Maven 可以管理不同库的版本冲突,确保项目使用的是正确的版本,避免冲突和不一致性。

訾博(ZiBo)的博客 1339

车载以太网:PHY(物理层)介绍

本文以TJA1101芯片为实例介绍了车载以太网PHY(物理层)组成。

kevin1499的博客 6231

Maven学习(依赖版本维护、依赖传递、解决Maven依赖冲突的3种方式)

本篇博客的内容:主要学习了Maven高级特性中的依赖管理。其中包括Maven依赖版本的维护、Maven如何依赖统一管理、Maven的传递依赖以及Maven传递依赖引发的依赖冲突问题的3种解决方法......

岁岁岁平安的博客 2564

cartographer 添加二维码、apritag码作为路标点,测试位置关系

这里记录一下cartographer里面的路标点是如何转换的,首先你要知道路标点在相机坐标系的位置(很多二维码读码器的关系恰好相反,是相机在二维码的坐标系),然后要知道相机坐标系和小车坐标系(一般为base_link)之间的关系。中间用tf_broadcaster_发出来便于查看是否设置正确 void Node::HandleLandmarkMessage( const int trajectory_id, const std::string& sensor_id, const ca

南北粉面馆 2433

Python爬虫实战 | 拼多多商品评论采集与深度分析

本文从 API 调用、网页渲染到情感分析与关键词提取,全流程剖析了“拼多多商品评论采集与分析”项目。Scrapy + API 可快速抓取评论;Playwright 可突破 API 限制,抓取完整页面内容;数据清洗 + 分析揭示用户真实反馈;可持续部署、扩展至更多商品 & 时间段;

2201_76125261的博客 1696

【Maven】依赖传递,解决依赖冲突

【Maven】依赖传递,解决依赖冲突1. 什么是依赖传递?2. 解决依赖冲突2.1 解决依赖冲突有以下原则2.2 排除依赖2.3 锁定版本 1. 什么是依赖传递? 首先我们先随便添加个spring的依赖 <dependency> <groupId>org.springframework</groupId> ...

来日浅谈的博客 2680

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java 依赖冲突终极解法:Maven 依赖树分析与强制版本锁定

在Java企业级开发中,依赖管理是项目构建的核心环节之一。随着项目规模的扩大和第三方库的引入,依赖冲突问题逐渐成为开发者面临的“隐形杀手”——看似正常的代码可能在运行时抛出NoSuchMethodError、ClassNotFoundException等异常,甚至引发难以调试的行为不一致问题。本文将从Maven依赖树分析入手,结合版本强制锁定策略,系统化解决Java项目中的依赖冲突难题。

犬余的博客 2165

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Maven传递依赖冲突解决(版本冲突)

最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。• provided是没有传递性的,也就是说,如果你依赖的某个jar包,它的某个jar的范围是provided,那么该jar不会在你的工程中依靠jar依赖传递加入到你的工程中。在Maven的依赖管理中,经常会用到依赖的scope设置。

qq_45035939的博客 2663

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Maven依赖冲突问题排查经验

报错Not running on Jetty,而我们的服务是运行在tomcat上,配合从上到下排查的思路,在新引入的maven依赖项打开pom.xml,查看里面的依赖项还有parent里的依赖项,找到了以下元凶:parent里会依赖***-boot-starter-web,而这里默认使用jetty作为引擎,遂排除掉,并验证业务逻辑是否正常。maven中禁止有循环依赖。开发环境,建议默认日志级别设置为info,对需要关注的模块,建议设置为debug模式,比如当前工程目录,正在联调的依赖jar包。

2501_90472645的博客 2282

学习maven(添加依赖坐标,maven的常用命令,依赖传递,解决依赖冲突)

本篇博客的重点学会从maven中央仓库中下载jar 包,或复制 依赖坐标学会使用 maven常用命令理解依赖传递和处理如何解决冲突问题就上面我举得例子,引入的两个jar 包 内部都使用 D jar 包,但使用D jar包的版本 却都不相同。那应该选择哪一个版本的Djar包?这就是依赖冲突问题。IDEA 面对这个问题,有可能会报错解决依赖冲突有三种办法1 使用maven提供的依赖调解原则 (自动)第一种方式,不用我们修改什么,我们通过maven 构建的项目会自动修复,舍弃其中一个。

等什么君!的博客 1414

Maven - 依赖冲突排查 使用dependency:tree定位问题

摘要 本文深入探讨了Maven依赖冲突的排查方法,重点介绍了mvn dependency:tree命令的使用。依赖冲突常见于不同库需要同一依赖的不同版本时,可能导致运行时错误或编译失败。文章首先解释了依赖冲突的概念、常见原因(如传递性依赖、版本不一致等)及其影响(如编译错误、功能异常等)。随后详细介绍了dependency:tree命令的功能,包括如何执行、解析其树状输出格式,并通过示例展示了如何识别冲突点。该命令能清晰呈现项目依赖关系,帮助开发者快速定位问题,是解决Maven依赖冲突的重要工具。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Maven依赖冲突避坑指北

假如项目工程是2019年底创建,并且依赖了版本为 2.9.10的jackson-core, 到2021年,由于需求的迭代,增加了很多新的依赖,这些新的依赖如果使用的jackson-core是2.11之后的版本,并且使用了诸如上面这个只在后续版本中存在的方法,则很有可能因为依赖冲突,因为工程真正还是使用的 2.9.10版本的库。有个最直接的现象,即在实际开发过程中,或多或少要引入一些依赖,若在引入依赖后工程无法启动了,或者之前都正常运行的逻辑却在某些场景下突然报错了等等,依赖冲突可能就是罪魁祸首。

一个天秤座的架构师 2万+

【Gradle】(三)详细聊聊依赖管理:坐标、依赖配置、依赖传递、依赖冲突

本文着重针对 Gradle 的依赖管理展开了全方位且极为详尽的介绍。在此过程中,清晰明确地提及了诸如坐标、依赖的基础概念、依赖配置、依赖传递还有依赖冲突等相关特性。在充分熟知并掌握了这些特性之后,于后续开展的工作当中,就能够更加精确、细致地对依赖进行管理,并且可以妥善、有效地处理由依赖冲突所引发的各种各样的问题。

积木成林,聚沙成塔 3640

深入学习Maven依赖传递原理及实践问题分析

Maven中jar包冲突是令程序员常见比较头疼的问题。所以我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题。本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法。

麦田守望者 2694
上一篇: java程序员一定要学会的骚操作“Linux下查看、卸载、安装jdk” !
下一篇: 字节架构师:关于Java方法和调用,看完这篇,带你不迷路!
Danny_java
博客等级 码龄5年 9粉丝 64原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值