如果你在学习JAVA,那么MAVEN会是绕不过去的工具之一。
这个视频我将站在一个新手的角度带着你学会MAVEN的安装,配置以及在VSCODE中结合命令行使用MAVEN。
这依然是保姆级教程,建议点赞收藏后观看,实际操作时可以随时翻看。

一、Maven 是什么?为什么需要它?
MAVEN是由Apache 基金会在2002年创建,主要为了解决当时JAVA开发的几个问题:
缺乏统一标准,依赖管理,项目构建混乱的问题。
大家看这几行JAVA代码,它使用SPRINGBOOT实现了一个简单的REST控制器。
然而就这么一个简单的JAVA程序,它的依赖项却是这样的。
这些依赖中,如果某个必需的依赖未正确引入,或者引入错误的依赖版本都可能导至程序无法正常运行。
这么多的依赖库,如果完全靠你手动去管理是不是想都头大。
而有了MAVEN,你只需要在它的核心配置文件中写入这2行,其它的都交给了MAVEN。
二、Maven 安装步骤
下面正式进入我们的MAVEN之旅。
首先进入Maven官网地址:https://maven.apache.org/download.cgi
这里需要注意的是MAVEN 3.9以上的版本需要JDK 8或以上的版本才可以执行。
我们这个视频不再演示如何安装JDK,如有需要请翻看我之前发布的JAVA环境配置的视频。
选择最新的 Binary zip 文件。
也许你也发现了MAVEN并不区分WINDOWS, MAC, LINUX版本。
没错,其它MAVEN就是用JAVA编写的一个工具,因此Maven 可以在任何支持 Java 的平台上运行。
我们下载它,并解压到一个目录下。
三、配置 Maven 环境变量(Windows 示例)
接下来我们需要对它配置环境变量,一个是指定MAVEN_HOME,另外是添加Path。
这里以Windows 上配置环境变量为例:
右键 “运行” -> 输入 “sysdm.cpl” 打开系统属性。
选择 “高级” -> 在 “环境变量”。
新增 “MAVEN_HOME”,它的值指定为 Maven解压路径。
然后在 Path中我们添加一个,并指定为MAVEN_HOME下的BIN目录 “%MAVEN_HOME%\bin”。
然后我们打开一个命令行,输入mvn -v能看到输出版本号,说明你的maven安装成功。
四、Maven 核心配置文件 settings.xml
安装完成后我们需要对MAVEN做一些配置。
打开MAVEN所在目录下的CONF目录,里边有一个settings.xml文件。
首行找到localRepository,这里用于指定MAVEN本地缓存仓库的目录。
当 Maven 项目需要某个依赖时,Maven 首先会检查本地仓库是否已经存在该依赖。
如果存在就直接使用,如果不存在,就会从远程仓库下载这个依赖,同时会把它缓存到本地仓库。
默认这个目录位于用户目录下的.m2目录下。
如果你想为它指定一个新目录,就把localRepository这一行拷贝出来并指定你的目录。
我硬盘大,所以我直接使用默认目录。
配置阿里云镜像仓库
然后我们再配置一个镜像仓库,因为默认中央仓库在国外,下载依赖时可能会失败。
我们把它改成阿里云的镜像。
这里的mirrorOf指定当访问哪些远程仓库时匹配这个镜像。
这里的central表示需要访问MAVEN中央仓库下载依赖时就使用这个镜像来下载。
其它的配置还有*号表示所有远程仓库以及指定的私有仓库名称等。
关于 JDK 版本配置的澄清
到这里需要特别强调一下,在做这个视频教程前,我也看过网上其它做的视频以及图文教程。
都是千篇一律的说默认情况下MAVEN使用JDK 1.5或1.7的版本,因此需要在settings.xml文件的profile中配置JDK的默认版本,现在JDK都到了23了,你们真的相信MAVEN会傻到还默认使用JDK 1.5吗?
真实的情况是MAVEN是通过JAVA_HOME指定的环境变量来使用JDK,它并不会从SETTINGS.XML中的PROFILE来读取JDK版本。
其实我们在使用MVN -V查看MAVEN版本的时,它就提示了你会使用的JDK版本。
例如在我们的MVN -V的输出中明确显示了它所使用的JDK版本是 23.0.1。
那这里的PROFILE配置到底是什么作用呢?
其实这个Profile 是 Maven 中用于在构建时根据不同的条件(如 JDK 版本、操作系统、环境变量等)加载不同的配置的机制。
这里的activation是指激活条件,例如这activation中只有一个激活条件就是当JDK是1.4版本时,它就会激活以下这些参数。
这个配置的主要作用是为了解决某些老旧的项目需要特定的 JDK支持。
至此我们就完成了MAVEN的安装配置了。
五、使用命令行创建 Maven 项目
现在我们使用这个MAVEN命令行来创建一个项目:
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
我们对这个命令行参数做一下解释:
archetype是使用 Maven 的 archetype 插件生成项目,archetype 是 Maven 中的项目模板机制,用于快速创建预定义结构的项目。
-D连接的都是MAVEN的参数。
groupId是指项目的组织标识符,通常是公司或项目的唯一包命名空间。
-DartifactId是项目的名称。
-DarchetypeArtifactId指定要使用的项目模板,每种项目模板的目录结构会有一些差别,maven-archetype-quickstart 是一个基础的 Maven 项目模板,它生成一个简单的 Java 项目。
-DinteractiveMode指是否以交互模式运行,false是非交互模式。
在运行该命令之前我看一下我们的本地仓库目录,现在是空的。一会做个比较。
运行该命令后,Maven 会下载 maven-archetype-quickstart 模板的依赖,使用指定的 groupId、artifactId 和模板生成一个基础 Java 项目。
可以看到现在MAVEN正在下载所需要的依赖到本地仓库。
现在MAVEN已经完成创建项目。
再回头看我们的本地仓库,MAVEN已经将远程仓库中所需要的依赖下载到本地仓库了。
六、项目结构与 POM.xml 详解
我们用VSCODE打开刚才生成的JAVA项目看一下。
这是一个典型的QUICKSTART模板创建的项目结构,在SRC目录存放了JAVA的源码文件,而在TEST存放了单元测试的源码。
在源码文件中只是简单输出一行HELLO WORLD。
在单元测试的源码中,MAVEN模板也为我们生成了简单的几行测试代码。
最后也是MAVEN的核心配置文件POM.XML,我们一起来看下这个文件的内容:
- modelVersion指定 POM 文件的模型版本
- groupId是项目组织或分组的唯一标识符,一般以公司或组织的域名倒序命名
- artifactId是项目或模块的唯一标识符,通常是项目的名称
- packaging是项目构建的打包类型,常见值是JAR是指将项目打成JAR包,WAR将项目打成WAR包,POM表示这是一个父项目,仅用于管理子模块
- version项目版本号
- name是项目的名称,仅用于描述目的
- dependencies是项目的依赖管理区域,Maven 根据区域解析依赖关系并自动下载相关库
- dependency用于定义单个依赖
- groupId是依赖库的组织或分组标识符,示例中的 junit 表示这是 JUnit 的依赖
- artifactId是依赖库的唯一标识符
- version是依赖库的版本号
- scope用于定义依赖的作用范围,test表示仅在测试时需要的依赖
另外的值还有compile表示编译时需要的依赖,runtime表示运行时需要但编译时不需要,provided表示由容器(如 Tomcat)提供的依赖。
这里大家需要掌握一个知识点就是MAVEN的GAV坐标:G是指GROUPID, A是指artifactId,而V是指version。MAVEN中可以通过这3个字段的值来在本地仓库或者远程仓库中找到一个唯一的依赖包。
示例中的GROUPID是JUNIT,而artifactId也是JUNIT,version是3.8.1。
因为在创建项目时MAVEN已经将依赖下载到本地仓库,那我们现在可以在本地仓库中依照这三者的顺序找到这个依赖。
七、Maven 构建生命周期与常用命令
在开始了解MAVEN的构建命令之前,我们需要了解MAVEN构建生命周期的概念。
Maven 的构建生命周期(Build Lifecycle)是指 Maven 为项目的构建和管理定义的一系列阶段的集合。它包括验证有效性validate,编译compile、测试test、打包package、安装install, 发布到远程仓库deploy等。
各构建命令详解
mvn validate 用于验证项目的基本信息。例如在POM.XML文件中groupId是必须字段,我们把它删除再执行MVN validate看看,可以看到这时候执行mvn validate会提示出错。
mvn compile 是将项目的源代码编译到目标文件夹。我们执行它,可以看到在target目录已经生成了对应的class文件。
mvn test 是执行项目的单元测试。我们现在执行它,可以看到它成功执行单元测试。我们现在对单元测试代码稍作修改,这里返回FALSE,再执行mvn test,现在提示单独测试失败了。
mvn package 是执行打包,也就是将项目打成jar包或者WAR包。我们的示例配置中是打成JAR包。注意在执行之前我们TARGET目录下是没有生成.JAR文件的,现在我们执行它。打包完成,现在在target目录下多了一个.jar的文件。这就是MAVEN为我们生成的可执行JAR包。
我们现在运行它,输入java -cp 然后加上这个JAR包的目录文件名,再加上入口类的名称,回车就可以运行它。
mvn install 是将生成的JAR包安装到本地仓库中,以供其它项目使用。我们运行它。执行完成后,我们再打开本地仓库,因为我们的示例项目包是com.example,所以对应找到COM目录,再打开EXAMPLE目录,my-app就是我们刚才创建的项目。
mvn deploy 用于将包发布的远程仓库,这个我们暂时不讲。
mvn clean 它用于将上一次构建的文件删除。我们现在执行mvn clean,可以看到执行完成后,之前生成的这些文件都没有了。
另外,MAVEN生命周期中的这些构建过程都是前后依赖的。如果我们只执行mvn install,那它其实会自动将前边的validate, test, package先执行,然后再执行install。
八、总结
到此,你就已经完全掌握了MAVEN的基本概念,以及使用MAVEN命令行创建,测试,打包,安装一个JAVA项目。
有网友可能要说,有IDEA那么好的GUI工具不用,干嘛要学这么复杂的命令行操作。
了解MAVEN的命令行操作更有助于你深入了解 Maven 的构建流程。另外在CI/CD 流水线上都是使用命令行方式进行的。


