Maven依赖解析过程详细讲解

Maven依赖解析是一个递归的过程,涉及从项目的POM文件开始,逐步解析直接依赖和传递依赖。以下是详细的解析过程:

  1. 读取项目的POM文件

    • Maven首先读取项目的POM文件 (pom.xml),该文件定义了项目的直接依赖。
  2. 解析直接依赖

    • Maven解析POM文件中的 <dependencies> 元素,获取所有直接依赖的信息(包括依赖的坐标:groupId, artifactId, version)。
  3. 下载直接依赖

    • Maven从本地仓库缓存中查找这些直接依赖。如果在本地仓库中找不到,则从远程仓库(如Maven Central或其他配置的仓库)下载这些依赖,并缓存到本地仓库中。
  4. 解析传递依赖

    • 对于每个直接依赖,Maven会读取这些依赖的POM文件。每个依赖的POM文件也可能包含 <dependencies> 元素,定义了该依赖的直接依赖(即传递依赖)。
  5. 递归解析传递依赖

    • Maven递归地解析每个传递依赖的POM文件,重复上述步骤,直到所有依赖树的节点都被解析完毕。
  6. 依赖树的构建

    • Maven构建一个依赖树(Dependency Tree),其中包含所有直接和传递依赖。这个树结构有助于理解依赖关系以及依赖冲突的解决。
  7. 版本冲突解决

    • 如果在依赖树中存在同一依赖的多个版本,Maven会使用最近的祖先(nearest ancestor)的版本。这意味着在解析依赖树时,Maven会选择距离根节点最近的那个版本。
  8. 下载传递依赖

    • 对于所有解析出来的传递依赖,Maven同样会从本地仓库查找这些依赖,如果找不到则从远程仓库下载并缓存。
  9. 依赖合并

    • 最后,Maven将所有解析到的依赖合并到项目的依赖列表中,确保所有需要的库都被正确下载和包含。

示例

假设有一个项目A,依赖于库B和库C,而库B又依赖于库D和库E,库C依赖于库F。

  1. 项目A的POM文件:

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>B</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>C</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    
  2. 库B的POM文件:

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>D</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>E</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    
  3. 库C的POM文件:

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>F</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    

依赖解析过程

  1. 解析项目A的POM文件,发现直接依赖B和C。
  2. 下载B和C
  3. 解析B的POM文件,发现传递依赖D和E。
  4. 下载D和E
  5. 解析C的POM文件,发现传递依赖F。
  6. 下载F
  7. 构建依赖树
    A
    ├── B
    │   ├── D
    │   └── E
    └── C
        └── F
    
  8. 解决版本冲突(如果有)。
  9. 合并依赖,最终项目A的依赖包括B、C、D、E、F。

java.lang.NoClassDefFoundError的原因

java.lang.NoClassDefFoundError 异常通常发生在运行时,表示JVM在类加载时找不到需要的类。其常见原因包括:

  1. 缺少依赖

    • 项目运行时所需的某些依赖未包含在类路径中。例如,某个库在编译时存在,但在运行时缺失。
    • 解决方法:确保所有必要的依赖都已正确配置并包含在项目的类路径中。
  2. 依赖冲突

    • 项目中存在不同版本的同一依赖,导致类加载错误。
    • 解决方法:使用Maven的 dependency:tree 插件来检查依赖冲突,并在POM文件中强制指定版本。
  3. 类路径配置错误

    • 项目的类路径配置不正确,导致某些库未被加载。
    • 解决方法:检查和修正类路径配置,确保所有必要的库都被正确包含。
  4. 打包问题

    • 在打包过程中,某些依赖未正确打包到最终的可执行文件(如JAR或WAR)中。
    • 解决方法:检查打包配置(如Maven的 maven-assembly-plugin 或 maven-shade-plugin),确保所有依赖都被正确打包。
  5. 环境问题

    • 项目运行的环境与开发环境不一致,例如不同的JDK版本或环境变量配置不正确。
    • 解决方法:确保运行环境与开发环境一致,并正确配置所有环境变量。

通过以上步骤和检查,可以有效地解析Maven依赖并解决 java.lang.NoClassDefFoundError 异常。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android自动化测试实践:uiautomator2 核心功能与应用指南

Android自动化测试实践&#xff1a;uiautomator2 核心功能与应用指南 uiautomator2 是一个用于Android应用的自动化测试Python库&#xff0c;支持多设备并行测试操作。它提供了丰富的API来模拟用户对App的各种操作&#xff0c;如安装、卸载、启动、停止以及清除应用数据等。此外…

基于索尼基于索尼Spresense的眼睛跟随平台中两个模型的对比

1.模型一(现在使用的) 这个模型是一个简单的神经网络&#xff0c;由三个主要组件组成&#xff1a;输入层、一个全连接层&#xff08;Affine层&#xff09;、一个Sigmoid激活函数层和一个Binary Cross Entropy损失层。 以下是每个组件的说明&#xff1a; Input 层&#xff1a;这…

计算机专业的概念需要拓宽|终身学习之旅利:用FlowUs打造个性化学习记录知识库

计算机相关专业长期以来一直是热门选择&#xff0c;这主要得益于技术的快速发展和广泛的应用场景。随着AI技术的不断进步&#xff0c;这一趋势在未来几年内仍有望持续。以下是从不同角度对这个问题的分析&#xff1a; 从AI发展的角度&#xff1a; 技术革新&#xff1a;AI技术…

axios的底层ajax,XMLHttpRequest原理解释及使用方法

定义 ajax全称asychronous JavaScript and XML 意思是异步的 JavaScript和xml&#xff0c; 也就是通过javascript创建XMLHttpRequest &#xff08;xhr&#xff09;对象与服务器进行通信 步骤 创建实例对象&#xff0c;初始请求方法和url&#xff0c;设置监听器监听请求完成…

人工智能在音乐创作中的双刃剑:创新与挑战

AI在创造还是毁掉音乐&#xff1f; 简介 最近一个月&#xff0c;轮番上线的音乐大模型&#xff0c;一举将素人生产音乐的门槛降到了最低&#xff0c;并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后&#xff0c;AI产品的版权归属于谁&#xff0c;创意产业要如何在AI的阴…

经典FC游戏web模拟器--EmulatorJS

简介 EmulatorJS是一个基于JavaScript和Webassembly技术的虚拟环境的实现&#xff0c;可以在网页中运行各种经典FC游戏系统&#xff0c;支持任天堂、世嘉、雅达利等经典红白机。EmulatorJS的诞生使得诸如超级玛丽、坦克大战、魂斗罗等经典FC游戏能够以一种全新的方式回归。本文…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

动手学深度学习 --带你了解chatgpt,跟上AI发展!

本书旨在向读者交付有关深度学习的交互式学习体验。书中不仅阐述深度学习的算法原理&#xff0c;还演示它们的实现和运行。与传统图书不同&#xff0c;本书的每一节都是一个可以下载并运行的 Jupyter记事本&#xff0c;它将文字、公式、图像、代码和运行结果结合在了一起。此外…

【JS】纯web端使用ffmpeg实现的视频编辑器-视频合并

纯前端实现的视频合并 接上篇ffmpeg文章 【JS】纯web端使用ffmpeg实现的视频编辑器 这次主要添加了一个函数&#xff0c;实现了视频合并的操作。 static mergeArgs(timelineList) {const cmd []console.log(时间轴数据,timelineList)console.log("文件1",this.readD…

openGauss真的比PostgreSQL差了10年?

前不久写了MogDB针对PostgreSQL的兼容性文章&#xff0c;我在文中提到针对PostgreSQL而言&#xff0c;MogDB兼容性还是不错的&#xff0c;其中也给出了其中一个能源客户之前POC的迁移报告数据。 But很快我发现总有人回留言喷我&#xff0c;而且我发现每次喷的这帮人是根本不看文…

容器内存

一、容器内存概述 容器本质上还是一个进程&#xff0c;是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的&#xff0c;这块主要涉及三部分内容&#xff1a;RSS&#xff0c;page cache和swap这三部分&#xff0c;容器基于memory Cgroup对内存进行限制…

Xorbits inference操作实战

1.操作环境 序号软件版本备注1Windows1.版本&#xff1a;Windows 10 专业版2.版本号&#xff1a;21H23.操作系统内部版本&#xff1a;19044.18892Docker Desktop4.24.2 (124339)3WSLUbuntu 22.04 LTS4Python3.105CUDA12.16Dify0.6.6 Xorbits inference 是一个强大且通用的分布…

Python基础001

Python输出语句 print输出字符串 print("中国四大名著&#xff1a;","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是&#xff1a;") p…

在非 antd pro 项目中使用 umi OpenAPI

大家好&#xff0c;我是松柏。自从跟着鱼皮哥使用了ant design pro中的OpenAPI插件之后&#xff0c;我已经无法忍受自己写请求后端接口的方法了&#xff0c;所以这篇文章记录一下如何在非ant design pro项目中使用OpenAPI。 安装依赖 首先我们需要安装包umijs/openapi&#x…

java面试课程-SpringIOC部分源码解析

1.SpringIOC的refresh源码解析 核心&#xff1a; 核心使用的是&#xff1a; 需要完成配置类的解析&#xff0c;各种BeanFactoryProcessor的注册。还有写国际化配置的初始化。Web容器的内部构造。 上面几个方法是refresh方法的内容。注意可以与applicationContext里的内容一起…

Profibus DP主站转Modbus网关连接智能化电表通讯

Profibus DP主站转Modbus网关&#xff08;XD-MDPBM20&#xff09;&#xff0c;是实现不同工业通信协议之间互联互通的设备&#xff0c;主要将Profibus DP协议转换为Modbus协议&#xff0c;实现数据的双向传输。通过Profibus DP主站转Modbus网关&#xff08;XD-MDPBM20&#xff…

大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容?

环境: Excel2016 问题描述: 大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容? 解决方案: 遇到这种情况,说明Excel文件非常大,超出了你当前计算机配置的处理能力。以下是一些解决方法,帮助你尝试打开或…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

编译原理2

推导和短语 推导 推导过程中&#xff0c;每一步推导都是对句型的 最右非终结符 进行替换&#xff0c;最右推导(规范推导)&#xff1b; 短语 用 β 替换 A&#xff0c;则 β 就是 关于A 的一个短语&#xff1b; 直接短语是短语范围内的一步推导&#xff1b; 直接短语可能不…

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …
最新文章