【maven01】依赖管理的工具 - 教程

一、Maven 是什么?

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

它的核心思想是“约定优于配置”。这意味着 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.maven, org.springframework)。

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

  • version: 项目的版本号(例如 5.3.8, 4.13.2)。

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

  • 本地仓库(Local Repository)

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

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

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

  • 远程仓库(Remote Repository)

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

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

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

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

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

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

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

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

在 Maven 项目中,你只需要pom.xml 中声明对 A.jar 的依赖。Maven 会自动将 A, B, C 三个 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大模型应用。

posted @ 2025-09-19 09:11  yfceshi  阅读(15)  评论(0)    收藏  举报