当前位置: 首页 > news >正文

【maven01】依赖管理的工具

一、Maven 是什么?

Maven 是一个项目管理和构建自动化工具。它最初起源于 Apache 项目,现在已经成为 Java 世界中最主流、最通用的构建工具之一(另外两个主流是 Gradle 和 Ant)。

它的核心思想是 “约定优于配置” 。这意味着 Maven 定义了一套标准的项目结构、构建生命周期和依赖管理方式。开发者只要遵循这个约定,就可以用非常简单的命令完成复杂的构建过程,而无需编写大量的配置脚本。

二、为什么需要 Maven?(它解决了什么问题)

在没有 Maven 或类似工具的时代,开发一个 Java 项目会遇到很多麻烦:

  1. 依赖管理困难:项目需要很多第三方 JAR 包(如 JUnit、Spring、Hibernate 等)。你需要手动去官网下载,并添加到项目的 lib 目录中。更头疼的是,这些 JAR 包本身可能还依赖其他的 JAR 包(即“传递性依赖”),你需要把它们都找齐,非常容易出错,且版本冲突频发。

  2. 构建过程复杂:编译、测试、打包、部署等步骤需要手动执行一系列命令,或者编写复杂的 Ant 脚本,过程繁琐且不易统一。

  3. 项目结构不统一:每个人的项目目录结构都可能不一样,导致新人上手成本高,项目难以维护。

Maven 完美地解决了以上所有问题。

统一项目结构:提供标准、统一的项目结构

Maven 的标准项目构建流程可以概括为:

清理(clean) -> 验证(validate) -> 编译(compile) -> 测试(test) -> 打包(package) -> 检查(verify) -> 安装(install) -> 部署(deploy)

生命周期
Maven对项目构建的生命周期划分为3套(相互独立):
clean:清理工作。
default:核心工作。如:编译、测试、打包、安装、部署等。
site:生成报告、发布站点等。

我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,主
要关注以下几个:
• clean:移除上一次构建生成的文件
• compile:编译项目源代码
• test:使用合适的单元测试框架运行测试(junit)
• package:将编译后的文件打包,如:jarwar
• install:安装项目到本地仓库Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际工作。Maven的设计中,实际任务 (如源代码编译)都交由插件来完成

依赖管理

Maven 的依赖管理基于以下几个核心机制协同工作:

1. 坐标(Coordinates):唯一标识

Maven 使用 坐标 来唯一标识一个构件(可以是项目生成的,也可以是第三方库)。坐标就像一件商品的条形码,由三个基本元素组成:

  • groupId: 定义项目所属的组织或公司(通常是域名反写,例如 org.apache.mavenorg.springframework)。

  • artifactId: 定义项目的唯一模块ID(通常是项目名,例如 spring-corejunit)。

  • version: 项目的版本号(例如 5.3.84.13.2)。

2. 仓库(Repository):存储与获取
  • 仓库是存放所有 Maven 构件(JAR 包、插件等)的地方,分为两类:

  • 本地仓库(Local Repository)

    • 在你个人电脑上的一个目录(默认是 用户目录/.m2/repository)。

    • 当你第一次引入某个依赖时,Maven 会从远程仓库下载它并存储在本地仓库中。

    • 下次再使用相同依赖时,Maven 会直接使用本地仓库的副本,无需重复下载,极大提高了构建速度。

  • 远程仓库(Remote Repository)

    • 中央仓库(Central Repository):Maven 社区维护的默认全球仓库,包含了绝大多数流行的开源库。无需任何特殊配置即可使用。

    • 私服(Private Repository):很多公司在内网搭建的私有 Maven 仓库(使用 Nexus 或 Artifactory)。

      • 目的:作为中央仓库的代理和缓存,加速内网构建速度;部署公司内部开发的私有构件;控制外部依赖的访问。

3. 传递性依赖(Transitive Dependencies):自动处理

这是 Maven 依赖管理中最强大的特性。你只需要声明你直接使用的库(例如 Spring),Maven 会自动引入这个库所依赖的所有其他库(传递性依赖),以及这些库的依赖,直到整个依赖树完成。

示例
假设你的项目直接依赖了 A.jar

  • A.jar 本身又依赖于 B.jar

  • B.jar 本身又依赖于 C.jar

在 Maven 项目中,你只需要在 pom.xml 中声明对 A.jar 的依赖。Maven 会自动将 ABC 三个 JAR 包都加入到你的项目构建路径中。

关于依赖的其他内容

1. 依赖范围(Scope)

scope 用来控制依赖在哪个阶段有效,它决定了依赖是否会被打包到最终的构件中。这是非常重要且常用的配置。

Scope含义示例是否打入最终包?
compile默认值。在所有阶段都有效,包括编译、测试、运行。Spring Core
test只对测试代码有效。用于编译和运行测试,主代码不能用JUnit
provided表示该依赖在运行时将由 JDK 或容器(如 Tomcat)提供Servlet API
runtime测试和运行时需要,但编译时不需要JDBC 驱动
2. 排除依赖(Exclusions)

传递性依赖虽然方便,但有时也会带来问题,比如引入了有版本冲突或者不需要的传递性依赖。

这时可以使用 <exclusions> 标签来排除指定的传递性依赖

总结

Maven 的依赖管理机制通过:

  1. 坐标精准定位构件。

  2. 仓库统一存储和分发。

  3. 传递性依赖自动处理复杂的依赖关系。

  4. 依赖范围精细控制依赖的使用阶段和打包行为。

它将开发者从手动管理 JAR 包的繁琐、易错的工作中彻底解放出来,只需要一份声明式的 pom.xml 配置清单,即可实现高度自动化、可靠的依赖管理。这是现代Java开发不可或缺的基石。

这篇文章也是后端在应用层层面的开头,以后我们会见到spring全家桶,springcloud以及最新的ai大模型应用。


文章转载自:

http://RbTGVgnP.ykbgs.cn
http://qgC21zfo.ykbgs.cn
http://DBHtwO7w.ykbgs.cn
http://cDHBiNsb.ykbgs.cn
http://85U0EVRb.ykbgs.cn
http://q5bmblv0.ykbgs.cn
http://fg6O8xSH.ykbgs.cn
http://K8USS70X.ykbgs.cn
http://s8RgoQ52.ykbgs.cn
http://Rb6XlPSh.ykbgs.cn
http://jziqo2r4.ykbgs.cn
http://RLGHNtBd.ykbgs.cn
http://vOLT5fsY.ykbgs.cn
http://UXNExbY0.ykbgs.cn
http://05M334vw.ykbgs.cn
http://TOuxMi5T.ykbgs.cn
http://UsSpHhra.ykbgs.cn
http://Molx14ZS.ykbgs.cn
http://UQ0qkMNv.ykbgs.cn
http://2lm0LiPZ.ykbgs.cn
http://J5vyYvTA.ykbgs.cn
http://ndqwTbdw.ykbgs.cn
http://SflADaMG.ykbgs.cn
http://ofk9cPXs.ykbgs.cn
http://h2PNCUGN.ykbgs.cn
http://ss5AXS5C.ykbgs.cn
http://I6yYcdmT.ykbgs.cn
http://eePpxdEO.ykbgs.cn
http://06iFTG0P.ykbgs.cn
http://MOkJ9Cup.ykbgs.cn
http://www.dtcms.com/a/387327.html

相关文章:

  • BP神经网络多输入多输出回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)
  • MATLAB 时间序列小波周期分析
  • 计算机视觉进阶教学之DNN模块
  • 大模型无需懂MCP:工具调用范式的架构革命与实践指南
  • 剑指offer题单 9.14
  • IIS 站点 http 请求412问题解决
  • Web前端入门:从零开始做网站(视频教程)
  • 本地--Oracle表被锁了该如何处理
  • Doris与Clickhouse分析
  • ByteDance字节前端一面
  • 卫星通信+AI双核驱动,遨游智能三防手机连得上、会思考
  • 云手机通道具有哪些方面的优势
  • 前端实验(二)初识Vue
  • html.
  • 【人工智能与机器人研究】基于多模态的管道非接触式磁记忆检测方法研究
  • DIY Linux 桌面:让电脑再次快速运行
  • MySQL基础入门:开启数据库之旅
  • C++开发者如何开发自己的第一个mac应用(xcode + XIB + Objective-C C++)
  • LabVIEW风洞测试系统稳定性措施
  • Spring Boot 深入剖析:SpringBoot的启动流程
  • 机器人工具标定-记录一下-待验证(没数据)
  • 1.0 Labview中事件结构在while循环中使用注意事项(超时时间)
  • 微服务通信
  • 重定向、命令行判断、管道、正则三剑客
  • 破垄断!东土科技与海光信息联合发布全国产化工控系统,筑牢工业安全新底座
  • 一场史诗级的冒险——Docker命令大航海!
  • 基于 Node.js 的后端框架:NestJS 和 Express(二)
  • 大数据时代时序数据库选型指南:为何Apache IoTDB成优选——从技术架构与行业实践深度剖析
  • HBase 实战:3 步掌握基于 Rowkey 的数据更新技巧
  • 【Android】Jetpack Media3 播放音频文件