maven定义
Maven 最核心、最基础的两个功能(依赖管理和项目构建)。
作为「项目工具」:Maven 是 Java 项目的 "标准化流水线",定义了从源码到打包的所有流程,确保所有人按同一规则构建项目; 作为「依赖管理工具」:Maven 是 Java 项目的 "自动管家",负责找包、下包、管版本、解冲突,让开发者无需关心依赖的底层细节。
Maven 中 JAR 包的核心分类(按用途): 业务依赖 JAR:支撑项目运行 / 测试(第三方 JAR、其他项目产物 JAR); 插件依赖 JAR:支撑 Maven 构建过程(仅构建时用,不参与项目运行)
maven的作用
1. 标准化的项目结构
这是 Maven 最伟大的贡献之一,甚至比依赖管理更重要。
-
现状 :在没有 Maven 时,每个人项目的目录结构都不一样(
src放哪?lib放哪?配置文件放哪?)。新人接手项目首先要花半天时间找代码。 -
Maven 的作用 :它强制规定了一套标准目录结构(如
src/main/java,src/test/resources等)。 -
价值:任何熟悉 Maven 的人,拿到任何 Maven 项目,无需看文档就知道代码在哪、测试代码在哪、配置文件在哪。这极大地降低了团队协作成本。
2.传递性依赖管理
-
自动传递:引入 A,Maven 自动帮你把 B 和 C 都下载下来。
-
冲突解决:Maven 有严格的"最短路径优先"和"声明优先"策略来解决版本冲突(虽然有时候需要人工干预,但它提供了机制)。
-
范围控制 :可以指定依赖只在编译时有效(
provided,如 Servlet API),还是只在测试时有效(test,如 JUnit),避免打入最终包中。
3.统一的生命周期
Maven 将构建过程标准化为三个主要阶段,每个阶段包含多个插件执行点:
-
Clean:清理旧构建。
-
Default (Build):验证 -> 编译 -> 测试 -> 打包 -> 集成测试 -> 验证 -> 安装 -> 部署。
-
Site:生成项目站点文档。
-
价值 :无论项目多大,开发人员只需要记住几个命令(
mvn clean install,mvn test),不需要关心底层是调用了javac还是jar命令,也不需要维护复杂的 shell 脚本。CI/CD(持续集成)工具(如 Jenkins, GitLab CI)也是基于这套标准生命周期来工作的。
4. 多模块项目管理
这是企业级开发必不可少的功能。
-
场景 :大型系统通常拆分为
common(公共库),dao(数据层),service(业务层),web(表现层) 等多个子模块。 -
Maven 的作用:通过父 POM (Parent POM) 统一管理所有子模块的版本、依赖和插件配置。子模块之间可以互相引用,Maven 会自动处理构建顺序(先编译 common,再编译 dao...)。
-
价值:避免了手动管理多个项目间的引用关系,实现了"一处修改版本,全局生效"。
5. 中央仓库与生态体系
-
作用:Maven 背后有一个庞大的中央仓库(Maven Central),几乎所有开源 Java 库都在上面。
-
价值 :开发者不需要去各个官网下载 jar 包,只需在
pom.xml中写几行坐标(GroupId, ArtifactId, Version),Maven 自动下载。同时,私有仓库(如 Nexus, Artifactory)允许公司内部搭建自己的仓库,管理内部 jar 包和代理外部包,保障安全和速度。
讨论
-
理解目录结构 :为什么
src/main/java和src/test/java要分开? -
深入依赖机制
-
什么是
scope(compile, provided, runtime, test)? -
如何解决依赖冲突?(使用
mvn dependency:tree命令查看树状图)。
-
-
熟悉生命周期 :
mvn clean,mvn compile,mvn test,mvn package,mvn install,mvn deploy分别做了什么? -
多模块构建 :尝试创建一个父子工程,理解
和标签的作用。 -
插件机制 :明白 Maven 本身只是个框架,具体干活(编译、打包、生成文档)的都是插件(如
maven-compiler-plugin,maven-surefire-plugin)。
maven安装目录结构
-
bin 目录 该目录包含 Maven 的可执行脚本文件,是 Maven 命令的入口。 例如在 Windows 系统中,有 mvn.cmd、mvnDebug.cmd 等脚本 通过这些脚本,你可以在命令行中执行 mvn clean、mvn install 等 Maven 命令,完成项目构建、依赖管理等操作。
-
boot 目录 该目录存放 Maven 的启动器依赖,核心是 plexus-classworlds 相关的 jar 包。 plexus-classworlds 是一个类加载框架,Maven 借助它来实现自定义的类加载机制,从而启动 Maven 运行时环境。
-
conf 目录 该目录包含 Maven 的全局配置文件,最核心的是 settings.xml。 settings.xml 用于配置 Maven 的全局行为,比如: 指定本地仓库的路径(即依赖包本地存储的位置); 配置远程镜像仓库(如阿里云镜像,用于加速依赖下载); 设置代理、认证信息等。
-
lib 目录 该目录包含 Maven 运行所需的所有依赖库(jar 包)。

maven环境变量设置
一、前提:配置 JAVA_HOME Maven 依赖 Java 运行环境,因此必须先配置 JAVA_HOME(指向已安装的 JDK 目录,如 Java 17 的安装路径)。 二、配置 Maven 自身的环境变量(MAVEN_HOME 与 Path) 三、测试环境配置结果 打开新的命令提示符(CMD),输入 mvn -v 并回车。若输出 Maven 版本、Java 版本等信息,说明配置成功。 通过以上步骤,Maven 就能在系统中全局可用,无论是命令行执行 Maven 命令,还是在 IDE(如 IntelliJ IDEA)中集成 Maven,都能正常工作。
配置阿里云镜像
1、Maven 的中央仓库(Maven Central)的主服务器位于美国。在中国大陆直接连接美国的服务器,受到跨国带宽限制、网络波动以及防火墙(GFW)的影响,下载速度往往只有几 KB/s,甚至经常连接超时(Connection Timeout)。
阿里云在国内拥有多个数据中心,提供了专门针对国内网络优化的 Maven 镜像站。
2、配置步骤
1)创建一个H:\mymavenlocation\repository作为我们maven的本地仓库,不然它会默认放在:C:\Users\陈晓东下。
2)然后在H:\mymavenlocation\apache-maven-3.9.11-bin\apache-maven-3.9.11\conf\setting.xml文件中配置:
<localRepository>H:\mymavenlocation\repository</localRepository>
3)打开 settings.xml 文件,在 <mirrors> 标签内添加阿里云中央仓库镜像的配置: xml 3、验证配置 配置完成后,打开新的命令行窗口,执行 mvn help:system 命令。Maven 会尝试下载依赖,此时观察日志中依赖的下载地址,若显示为 https://maven.aliyun.com/...,则说明镜像配置成功。
XML
<!-- 阿里云中央仓库镜像 -->
<mirror>
<!-- 镜像唯一标识 -->
<id>nexus-aliyun</id>
<!-- 镜像替代的中央仓库(central 表示替代官方中央仓库) -->
<mirrorOf>central</mirrorOf>
<!-- 镜像名称 -->
<name>Nexus aliyun</name>
<!-- 镜像地址(阿里云 Maven 公共仓库) -->
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
下载资源
然后分享了maven仓库的地址;以及在 mvnrepository.com 下载坐标的步骤
我们先分享maven仓库的地址:
二、在 mvnrepository.com 下载坐标的步骤
1、搜索目标依赖 打开网站 https://mvnrepository.com/,在顶部搜索框输入依赖名称(如 Eclipse Collections、druid),点击搜索图标。
2、选择匹配的依赖 在搜索结果中,找到与需 在搜索结果中,找到与需求匹配的依赖(通过 groupId 和 artifactId 确认,如 org.eclipse.collections >> eclipse-collections),点击进入详情页。 3、选择版本号 进入依赖详情页后,会显示所有可用版本(按时间排序,最新版本通常在顶部),根据项目兼容性选择版本(如 12.0.0.M21),点击版本号。
4、复制坐标配置代码,粘贴到项目 pom.xml 中 保存文件后,Maven 会自动从远程仓库下载该依赖到本地仓库 进入依赖详情页后,会显示所有可用版本(按时间排序,最新版本通常在顶部),根据项目兼容性选择版本(如 12.0.0.M21),点击版本号。
仓库
仓库:用于存储资源,包含各种jar包 Maven 仓库分为本地仓库和远程仓库两大类,远程仓库又细分为中央仓库和私服。
-
本地仓库 定义:是你自己电脑上的一个目录,用于存储从远程仓库下载的资源,也可存储你本地项目构建生成的构件(如自己开发的 jar 包)。 作用:当项目需要依赖资源时,Maven 会先从本地仓库查找;若找不到,再去远程仓库下载,避免重复下载,提升构建效率。 配置:可通过 Maven 配置文件 settings.xml 中的 <localRepository> 标签指定路径(如 D:/Java/maven-repository)。
-
远程仓库 1)定义:位于远程服务器上的仓库,为本地仓库提供资源补充。 2)中央仓库:由 Maven 官方团队维护,是开源资源的 "总库",存储了几乎所有公开的开源依赖(如常见的框架、工具类库)。默认情况下,Maven 会自动连接中央仓库下载资源。
3)私服:由企业或团队在内部搭建的私有远程仓库,通常从中央仓库同步开源资源,同时存储企业内部的私有资源(如自主研发的 jar 包、购买的商业版权库)。
仓库的工作流程(结合图示理解)
当项目通过 Maven 构建需要依赖时,流程如下: Maven 先检查本地仓库,若找到所需资源,直接使用。 若本地仓库没有,Maven 会连接私服(若配置了私服),从私服查找;若私服有,下载到本地仓库后使用。 若私服也没有,Maven 会连接中央仓库,下载资源到本地仓库后使用。
maven坐标(GAVC)
Maven工程的 GAVP 指的是 Group、Artifact、Version、Packaging。这是 Maven 项目的基本坐标,用于唯一标识和定位项目。
格式为 :
groupId:artifactId:version(:classifier),
各元素作用如下: 1)groupId:组织 / 项目的唯一标识,通常用域名倒写(如公司域名 com.alibaba、开源组织 org.eclipse),避免同名冲突。 2)artifactId:具体项目或模块的名称(如 druid 连接池、eclipse-collections 集合框架),是组织内部的唯一标识。 3)version:资源版本号,格式通常为 主版本.次版本.修订号(如 1.0.0),快照版本会加 -SNAPSHOT(如 2.0.0-SNAPSHOT)。 4)classifier(可选):用于区分同一版本的不同变体,如 sources(源码包)、javadoc(文档包)、android(安卓适配包)。
注意:packaging(打包类型,如 jar/war/pom)不是坐标元素,它仅影响项目构建逻辑,它会告诉 Maven 这个项目该怎么编译、怎么打包(生成 .jar 还是 .war),以及作为依赖时被引用时的默认文件类型。
XML
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
<!-- classifier 和 packaging 通常不直接写在 dependency 标签里,除非需要特殊指定 -->
<!-- 如果我们需要它的源码包,会加上 classifier -->
<!-- <classifier>sources</classifier> -->
<!-- <type>jar</type> (默认就是 jar,通常省略) -->
</dependency>
总结: 坐标定位置,Packaging 定行为,Classifier 定变种。
总结
1、本文首先介绍了mave的作用,标准化的项目管理,传递性依赖管理,统一的生命周期;多模块项目管理;中央仓库和生态体系进行论证;然后通过几个问题对此知识点进行考验;
2、然后介绍了maven几个安装目录的结构:bin目录(Maven 命令的入口);boot 目录;conf 目录(包含了如 settings.xml等全局配置文件);lib目录(包含 Maven 运行所需的所有依赖库:jar包)
3、然后介绍了maven的环境变量设置,包括配置环境变量 JAVA_HOME,MAVEN_HOME;以及用mvn -v 命令进行验证;
6、然后分享了maven仓库的地址;以及在 mvnrepository.com 下载坐标的步骤
7、又介绍了maven配置阿里云镜像的原因(追求下载资源的速度),配置步骤(在settings.xml 文件中操作),验证配置的方法;
8、接着介绍了仓库的概念;本地仓库(定义;作用,配置方式);远程仓库(中央仓库和私服的定义);再介绍了下载jar包的工作流程;
9、又介绍了maven坐标,介绍其组成元素(groupid组织标识;artifactId模块名;version资源版本名;classifier)的定义和格式;并拓展了packaging(打包类型,如 jar/war/pom)决定了该项目的编译,打包方式以及作为依赖时被引用时的默认文件类型 ;
另:下一篇文章我们再详细的来介绍一下maven的最核心作用:依赖管理和项目构建。