【maven01】依赖管理的工具
一、Maven 是什么?
Maven 是一个项目管理和构建自动化工具。它最初起源于 Apache 项目,现在已经成为 Java 世界中最主流、最通用的构建工具之一(另外两个主流是 Gradle 和 Ant)。
它的核心思想是 “约定优于配置” 。这意味着 Maven 定义了一套标准的项目结构、构建生命周期和依赖管理方式。开发者只要遵循这个约定,就可以用非常简单的命令完成复杂的构建过程,而无需编写大量的配置脚本。
二、为什么需要 Maven?(它解决了什么问题)
在没有 Maven 或类似工具的时代,开发一个 Java 项目会遇到很多麻烦:
依赖管理困难:项目需要很多第三方 JAR 包(如 JUnit、Spring、Hibernate 等)。你需要手动去官网下载,并添加到项目的
lib
目录中。更头疼的是,这些 JAR 包本身可能还依赖其他的 JAR 包(即“传递性依赖”),你需要把它们都找齐,非常容易出错,且版本冲突频发。构建过程复杂:编译、测试、打包、部署等步骤需要手动执行一系列命令,或者编写复杂的 Ant 脚本,过程繁琐且不易统一。
项目结构不统一:每个人的项目目录结构都可能不一样,导致新人上手成本高,项目难以维护。
Maven 完美地解决了以上所有问题。
统一项目结构:提供标准、统一的项目结构
Maven 的标准项目构建流程可以概括为:
清理(clean) -> 验证(validate) -> 编译(compile) -> 测试(test) -> 打包(package) -> 检查(verify) -> 安装(install) -> 部署(deploy)
生命周期

依赖管理
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 仓库(使用 Nexus 或 Artifactory)。
目的:作为中央仓库的代理和缓存,加速内网构建速度;部署公司内部开发的私有构件;控制外部依赖的访问。
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 的依赖管理机制通过:
坐标精准定位构件。
仓库统一存储和分发。
传递性依赖自动处理复杂的依赖关系。
依赖范围精细控制依赖的使用阶段和打包行为。
它将开发者从手动管理 JAR 包的繁琐、易错的工作中彻底解放出来,只需要一份声明式的 pom.xml
配置清单,即可实现高度自动化、可靠的依赖管理。这是现代Java开发不可或缺的基石。
这篇文章也是后端在应用层层面的开头,以后我们会见到spring全家桶,springcloud以及最新的ai大模型应用。