从零认识 Maven:依赖管理 + 项目构建 + 单元测试知识点全梳理(附 IDEA 实操)
大家好!前面几篇我们把 Web 前端的三大件(HTML、CSS、JS+Vue+Ajax)都梳理完了,这次终于轮到后端 了。后端开发的第一步,不是急着写代码,而是先学会用工具把 Java 项目"管"起来------这个工具就是 Maven。
本文按照「初识 Maven → Maven 概述 → IDEA 集成 Maven → 依赖管理 → 单元测试 → 常见问题」的顺序整理,涵盖了 Maven 核心部分的全部知识点:它是什么、能干什么、怎么安装配置、怎么在 IDEA 里用、怎么管依赖、怎么写单元测试。
一、初识 Maven
1.1 Maven 是什么

Maven 是一款用于管理和构建 Java 项目 的工具,是 Apache 旗下的一个开源项目。
Apache 软件基金会成立于 1999 年 7 月,是目前世界上最大、最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非营利性组织。开源项目列表见 www.apache.org/index.html#...
那你可能要问:JavaSE 阶段我们没用 Maven,不也能构建 Java 项目吗?为什么现在要学它?------因为到了企业开发阶段,项目规模、依赖数量、构建流程都完全不一样了,Maven 的价值就体现出来了。
1.2 Maven 的作用
Maven 的作用可以概括为三点:依赖管理、项目构建、统一项目结构。
① 依赖管理:方便快捷地管理 jar 包,避免版本冲突
使用 Maven 之前:项目中想用一个 jar 包,需要先从官网把 jar 包下载下来,再手动导入到项目里。哪个包缺了、哪个包版本不对,全靠人肉维护:

使用 Maven 之后 :只需要在 pom.xml 文件中加一段配置,Maven 会自动根据配置信息去下载对应依赖,项目里直接就能用:

② 项目构建:提供标准化的跨平台自动化构建方式
我们开发了一套系统,代码要经过编译、测试、打包、发布等过程,这些操作是所有项目都要做的,反复手动做很麻烦:

而 Maven 提供了一套简单的命令(compile、test、package、deploy 等)来完成项目构建,而且跨平台------无论 Windows、Linux 还是 Mac,命令都一样。
③ 统一项目结构:标准、统一的目录结构
使用 Maven 之前:Java 开发工具有很多(IDEA、Eclipse、MyEclipse...),不同工具创建的 Java 项目目录结构存在差异------Eclipse 创建的项目不能直接导入 IDEA,反之亦然:

使用 Maven 之后:Maven 提供了一套标准的 Java 项目目录,无论用什么开发工具,只要是基于 Maven 构建的 Java 项目,目录结构都相同,可以在各开发工具间直接导入使用:

标准目录中:main 目录存放项目源代码 ,test 目录存放测试代码 ;而 main 和 test 下又各有两个目录------java 存放源代码文件,resources 存放配置文件。
一句话总结:Maven 就是一款管理和构建 Java 项目的工具。
补充说明:Maven 内容分为「Maven 核心」和「Maven 进阶」两部分,本文先讲核心部分(今天这篇),进阶部分在 Web 开发最后再讲。
二、Maven 概述
2.1 Maven 介绍
Apache Maven 是一个项目管理和构建工具,它基于项目对象模型 (Project Object Model,简称 POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
Maven 的作用(官方表述):
- 方便的依赖管理;
- 统一的项目结构;
- 标准的项目构建流程。
2.2 Maven 模型
Maven 主要包含三个模型:
- 项目对象模型(Project Object Model)
- 依赖管理模型(Dependency)
- 构建生命周期/阶段(Build lifecycle & phases)
① 构建生命周期/阶段:用于完成标准化构建流程。需要编译时,Maven 提供编译插件;需要打包时,提供打包插件......紫色框起来的部分就是构建生命周期:

② 项目对象模型 :把项目抽象成一个对象模型,项目有自己的专属坐标:

一个 Maven 项目的坐标如下:

坐标就是资源(jar 包)的唯一标识,通过坐标可以定位到所需资源的位置。
坐标的组成部分:
groupId:组织名artifactId:模块名version:版本号
③ 依赖管理模型:使用坐标来描述当前项目依赖哪些第三方 jar 包:

之前项目中需要 jar 包时,直接把 jar 包复制到项目下的 lib 目录;现在只需要在 pom.xml 中配置依赖即可,而这个依赖对应的 jar 包其实就在本地电脑的 Maven 仓库中:

2.3 Maven 仓库
仓库:用于存储资源、管理各种 jar 包。仓库的本质就是一个目录(文件夹),用来存储开发中所有的依赖(jar 包)和插件。
Maven 仓库分为三种:
- 本地仓库:自己计算机上的一个目录(用来存储 jar 包);
- 中央仓库 :由 Maven 团队维护的全球唯一的仓库,地址:repo1.maven.org/maven2/;
- 远程仓库(私服):一般由公司团队搭建的私有仓库。

jar 包的查找顺序:
- 首先查找本地仓库 中是否有对应的 jar 包:有则直接引用,没有则去中央仓库下载到本地仓库;
- 如果搭建了远程仓库(私服),查找顺序变为:本地仓库 → 远程仓库 → 中央仓库。
2.4 Maven 安装
下载
- 下载地址:maven.apache.org/download.cg...
- 课程资料中已提供安装包:
apache-maven-3.9.4-bin.zip
安装配置四步走
Maven 安装配置步骤:① 解压安装 → ② 配置仓库 → ③ 配置阿里云私服 → ④ 配置环境变量。
① 解压 apache-maven-3.9.4-bin.zip(解压即安装)
建议解压到没有中文、特殊字符的路径下(例如 E:\develop)。解压后目录结构:
| 目录 | 作用 |
|---|---|
bin |
存放可执行命令(mvn 命令重点关注) |
conf |
存放 Maven 的配置文件(settings.xml 后期需要修改) |
lib |
存放 Maven 依赖的 jar 包(Maven 本身也是 Java 开发的) |
② 配置本地仓库
- 在计算机上新建一个目录(本地仓库,用来存储 jar 包);
- 进入
conf目录修改settings.xml:打开文件定位到 53 行,把<localRepository>标签复制到注释外面(55 行),再用新建目录的路径替换标签体内容:

③ 配置阿里云私服
中央仓库在国外,下载 jar 包速度可能较慢;阿里提供了一个远程仓库,基本包含开源项目的 jar 包。在 settings.xml 的 <mirrors> 标签下添加子标签 <mirror>:
xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
注意配置位置:必须放在 <mirrors> ... </mirrors> 中间:

④ 配置环境变量
配置方式与 JDK 环境变量类似:
- 在系统变量中新建
MAVEN_HOME,值为 Maven 的解压安装目录:

- 在
Path中追加%MAVEN_HOME%\bin:

- 打开 DOS 命令提示符验证,输入
mvn -v,出现版本信息即安装成功:

⑤ 配置关联的 JDK 版本(可选)
在 settings.xml 的 <profiles>...</profiles> 中增加如下配置:
xml
<profile>
<id>jdk-17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
三、IDEA 集成 Maven
3.1 创建 Maven 项目
全局设置(对所有项目生效)
- 进入 IDEA 欢迎页,选择
File→close project→Customize→All settings(注意:如果是全局配置,要在关闭项目后的欢迎页操作,而不是在某个项目里):

- 打开
All settings,选择Build,Execution,Deployment→Build Tools→Maven:

- 配置工程的编译版本为 17:

这里设置的 Maven 环境信息不针对任何具体 project,属于全局配置;以后新建 project 默认就使用这套配置。
创建项目
- 创建一个空项目,命名为
web-project01(可在欢迎页New Project中创建); - 进入项目后设置 JDK 版本号:点击小齿轮,选择
Project Structure; - 创建模块:选择 Java 语言 + Maven,填写模块基本信息:

- 在 Maven 项目中创建 HelloWorld 类并运行:

Maven 项目的目录结构(重点记忆):
scss
maven-project01
|--- src (源代码目录和测试代码目录)
|--- main (源代码目录)
|--- java (源代码java文件目录)
|--- resources (源代码配置文件目录)
|--- test (测试代码目录)
|--- java (测试代码java目录)
|--- resources (测试代码配置文件目录)
|--- target (编译、打包生成文件存放目录)
pom 文件详解
POM (Project Object Model):项目对象模型,用来描述当前的 Maven 项目,用 pom.xml 文件来描述。
一个典型的 pom.xml:
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- POM模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 当前项目坐标 -->
<groupId>com.itheima</groupId>
<artifactId>maven-project01</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 项目的JDK版本及编码 -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
各标签含义:
<project>:pom 文件的根标签,表示当前 Maven 项目;<modelVersion>:声明项目描述遵循的 POM 模型版本(目前是 4.0.0,必不可少);- 坐标:
<groupId><artifactId><version>三个标签组成一个坐标,定位项目在本地仓库中的位置; <maven.compiler.source>:编译 JDK 的版本;<maven.compiler.target>:运行 JDK 的版本;<project.build.sourceEncoding>:设置项目的字符集。
3.2 Maven 坐标
- Maven 中的坐标是资源的唯一标识,通过坐标可以唯一定位资源位置;
- 使用坐标来定义项目,或引入项目中需要的依赖。
坐标的三个组成:
- groupId :定义当前 Maven 项目隶属组织名称(通常是域名反写,如
com.itheima); - artifactId :定义当前 Maven 项目名称(通常是模块名称,如
order-service、goods-service); - version :定义当前项目版本号
SNAPSHOT:功能不稳定、尚处于开发中的版本(快照版本);RELEASE:功能趋于稳定、可以用于发行的版本。

注意:上面所说的资源可以是插件、依赖、当前项目;我们的项目如果被其他项目依赖时,也需要通过坐标来引入。
3.3 导入 Maven 项目
在 IDEA 中导入已有 Maven 项目,有两种方式:
- 方式一 :
File→Project Structure→Modules→Import Module→ 选择 Maven 项目的pom.xml:

- 方式二 :
Maven 面板→+(Add Maven Projects)→ 选择 Maven 项目的pom.xml。
四、依赖管理
4.1 依赖配置
依赖:指当前项目运行所需要的 jar 包,一个项目可以引入多个依赖。
例如,当前工程需要用到 logback 来记录日志,就可以在 pom.xml 中引入 logback 依赖,具体三步:
- 在
pom.xml中编写<dependencies>标签; - 在
<dependencies>中使用<dependency>引入坐标; - 定义坐标的
groupId、artifactId、version。
xml
<dependencies>
<!-- 依赖 : spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
</dependency>
</dependencies>
配置完成后点击刷新按钮,引入最新加入的坐标:

注意事项:
- 如果引入的依赖在本地仓库中不存在,会连接远程/中央仓库下载(过程可能比较耗时,耐心等待);
- 如果不知道依赖的坐标信息,可以到 Maven 中央仓库搜索:mvnrepository.com/(也支持在 IDEA 中直接搜索依赖)。
4.2 依赖传递
在 pom.xml 中只配置了一项 spring-context 依赖,但打开右侧 Maven 面板会发现,引入进来的依赖不止这一项,还有非常多其他依赖:

这就涉及到 Maven 中非常重要的特性------依赖传递:
在 Maven 项目中,A 依赖了 B,B 依赖了 C,C 依赖了 D,那么在 A 项目中也会有 C、D 依赖,因为依赖会传递。
4.3 排除依赖
传递下来的依赖,如果项目中确实用不到,可以通过排除依赖功能把它排除掉:

- 排除依赖:主动断开对某个依赖资源的引入,被排除的资源无需指定版本;
- 配置形式如下:
xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
<!-- 排除依赖, 主动断开依赖的资源 -->
<exclusions>
<exclusion>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</exclusion>
</exclusions>
</dependency>
配置后,默认传递下来的 micrometer-observation 依赖就被排除掉了。
4.4 Maven 生命周期
生命周期:对所有的构建过程进行抽象和统一,描述一次项目构建要经历哪些阶段。
在 Maven 出现之前,项目构建的生命周期就已经存在------大家都在做清理、编译、测试及部署,但公司和公司之间往往用不同的方式做类似的工作。Maven 总结了一套高度完善、易扩展的构建生命周期,包含清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等几乎所有构建步骤。
Maven 将项目构建的生命周期划分为 3 套(相互独立):

- clean:清理工作;
- default:核心工作,如编译、测试、打包、安装、部署等;
- site:生成报告、发布站点等。
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段:

三套生命周期里阶段很多,但常用的并不多,主要关注以下几个:
| 阶段 | 作用 |
|---|---|
clean |
移除上一次构建生成的文件 |
compile |
编译项目源代码 |
test |
使用合适的单元测试框架运行测试(JUnit) |
package |
将编译后的文件打包,如 jar、war 等 |
install |
安装项目到本地仓库 |
关键理解: Maven 的生命周期是抽象的,生命周期本身不做任何实际工作------在 Maven 的设计中,实际任务(如源代码编译)都交由插件来完成。
IDEA 为了方便程序员使用 Maven 生命周期,在右侧 Maven 工具栏中提供了快速访问通道:

执行方式有两种:
- 在 IDEA 中执行:在右侧 Maven 工具栏选择对应的生命周期,双击执行;
- 在命令行中执行 :打开 Maven 项目所在磁盘目录,在当前目录下打开 CMD,执行
mvn compile/mvn test/mvn package/mvn install等命令。
说明: 在同一套生命周期中,执行后面的阶段时,前面的阶段都会自动执行。
思考: 运行
package时,clean、compile会不会运行?答:clean 不会运行,compile 会运行 。因为
compile与package同属 default 生命周期,而clean属于 clean 生命周期,不同生命周期相互独立。
五、单元测试
5.1 测试介绍
测试:一种用来促进鉴定软件正确性、完整性、安全性和质量的过程。
按阶段划分:单元测试、集成测试、系统测试、验收测试:
| 测试类型 | 介绍 | 目的 | 测试人员 |
|---|---|---|---|
| 单元测试 | 对软件的基本组成单位(通常是最小单元------方法)进行测试 | 检验基本组成单位的正确性 | 开发人员 |
| 集成测试 | 将已分别通过测试的单元按设计要求组合成系统/子系统再测试 | 检查单元之间的协作是否正确 | 开发人员 |
| 系统测试 | 对已集成好的软件系统进行彻底的测试 | 验证系统的正确性、性能是否满足要求 | 测试人员 |
| 验收测试 | 交付测试,针对用户需求、业务流程进行的正式测试 | 验证系统是否满足验收标准 | 客户/需求方 |
按测试方法划分:白盒测试、黑盒测试、灰盒测试:

- 白盒测试:清楚软件内部结构、代码逻辑,用于验证代码、逻辑正确性;
- 黑盒测试:不清楚软件内部结构和逻辑,用于验证功能、兼容性、验收测试等方面;
- 灰盒测试:结合两者特点,既关注内部结构又考虑外部表现(功能)。
5.2 JUnit 入门
- 单元测试:针对最小的功能单元(方法),编写测试代码对其正确性进行测试;
- JUnit:最流行的 Java 测试框架之一,提供了方便程序进行单元测试的功能(第三方提供)。
之前我们测试都是在 main 方法中进行,存在三个问题:
- 测试代码与源代码未分开,难维护;
- 一个方法测试失败,影响后面方法;
- 无法自动化测试、得到测试报告。
而使用 JUnit 单元测试框架后:
- 测试代码与源代码分开,便于维护;
- 可根据需要进行自动化测试;
- 可自动分析测试结果、产出测试报告。

入门程序: 使用 JUnit 对 UserService 中的业务方法进行单元测试。
Step 1:在 pom.xml 中引入 JUnit 依赖
xml
<!-- Junit单元测试依赖 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
Step 2:在 test/java 目录下创建测试类,编写测试方法并声明 @Test 注解
java
@Test
public void testGetAge() {
Integer age = new UserService().getAge("110002200505091218");
System.out.println(age);
}
Step 3:运行单元测试------测试通过显示绿色,测试失败显示红色:


注意:
- 测试类的命名规范为
XxxTest;- 测试方法的命名规定为
public void xxx(){...}。
5.3 断言
JUnit 提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期效果正常工作,这种方式称为断言。
为什么需要断言? 单元测试方法运行不报错,不代表业务方法没问题;通过断言可以检测方法运行结果是否与预期一致,从而判断业务方法逻辑的正确性。
常用断言方法:
| 断言方法 | 描述 |
|---|---|
assertEquals(Object exp, Object act, String msg) |
检查两个值是否相等,不相等就报错 |
assertNotEquals(Object unexp, Object act, String msg) |
检查两个值是否不相等,相等就报错 |
assertNull(Object act, String msg) |
检查对象是否为 null,不为 null 就报错 |
assertNotNull(Object act, String msg) |
检查对象是否不为 null,为 null 就报错 |
assertTrue(boolean condition, String msg) |
检查条件是否为 true,不为 true 就报错 |
assertFalse(boolean condition, String msg) |
检查条件是否为 false,不为 false 就报错 |
assertSame(Object exp, Object act, String msg) |
检查两个对象引用是否相等,不相等就报错 |
示例演示:
java
package com.itheima;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class UserServiceTest {
@Test
public void testGetAge2() {
Integer age = new UserService().getAge("110002200505091218");
Assertions.assertNotEquals(18, age, "两个值相等");
// String s1 = new String("Hello");
// String s2 = "Hello";
// Assertions.assertSame(s1, s2, "不是同一个对象引用");
}
@Test
public void testGetGender2() {
String gender = new UserService().getGender("612429198904201611");
Assertions.assertEquals("男", gender);
}
}

5.4 常见注解
JUnit 还提供了一些注解来增强功能,常见注解如下:
| 注解 | 说明 | 备注 |
|---|---|---|
@Test |
测试类中的方法用它修饰才能成为测试方法,才能启动执行 | 单元测试 |
@BeforeEach |
修饰实例方法,在每个测试方法执行之前执行一次 | 初始化资源(准备工作) |
@AfterEach |
修饰实例方法,在每个测试方法执行之后执行一次 | 释放资源(清理工作) |
@BeforeAll |
修饰静态方法 ,在所有测试方法之前只执行一次 | 初始化资源(准备工作) |
@AfterAll |
修饰静态方法 ,在所有测试方法之后只执行一次 | 释放资源(清理工作) |
@ParameterizedTest |
参数化测试注解(让单个测试运行多次,每次仅参数不同) | 用了该注解就不需要 @Test 了 |
@ValueSource |
参数化测试的参数来源,赋予测试方法参数 | 与参数化测试注解配合使用 |
@DisplayName |
指定测试类、测试方法显示的名称(默认为类名、方法名) | --- |
演示 @BeforeEach、@AfterEach、@BeforeAll、@AfterAll:
java
public class UserServiceTest {
@BeforeEach
public void testBefore() {
System.out.println("before...");
}
@AfterEach
public void testAfter() {
System.out.println("after...");
}
@BeforeAll // 该方法必须被static修饰
public static void testBeforeAll() {
System.out.println("before all ...");
}
@AfterAll // 该方法必须被static修饰
public static void testAfterAll() {
System.out.println("after all...");
}
@Test
public void testGetAge() {
Integer age = new UserService().getAge("110002200505091218");
System.out.println(age);
}
@Test
public void testGetGender() {
String gender = new UserService().getGender("612429198904201611");
System.out.println(gender);
}
}

执行顺序可以记为:@BeforeAll →(@BeforeEach → @Test → @AfterEach)× N → @AfterAll。
演示 @ParameterizedTest、@ValueSource、@DisplayName:
java
package com.itheima;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
@DisplayName("测试-学生业务操作")
public class UserServiceTest {
@DisplayName("测试-获取年龄")
@Test
public void testGetAge() {
Integer age = new UserService().getAge("110002200505091218");
System.out.println(age);
}
@DisplayName("测试-获取性别")
@Test
public void testGetGender() {
String gender = new UserService().getGender("612429198904201611");
System.out.println(gender);
}
@DisplayName("测试-获取性别3")
@ParameterizedTest
@ValueSource(strings = {"612429198904201611", "612429198904201631", "612429198904201626"})
public void testGetGender3(String idcard) {
String gender = new UserService().getGender(idcard);
System.out.println(gender);
}
}
一个 @ParameterizedTest + @ValueSource,就可以用 3 个身份证号分别运行一次测试,大大减少重复代码。
思考: 在 Maven 项目中,
test目录存放单元测试代码,是否可以在main目录中编写单元测试呢?答:可以,但是不规范 (规范的做法是通过依赖范围
scope来限制)。
5.5 依赖范围
依赖的 jar 包默认情况下可以在任何地方使用:main 目录可以用,test 目录也可以用。在 Maven 中,如果希望限制依赖的使用范围,可以通过 <scope>...</scope> 设置其作用范围。

作用范围有三个维度:
- 主程序范围是否有效(
main文件夹范围内); - 测试程序范围是否有效(
test文件夹范围内); - 是否参与打包运行(
package指令范围内)。
常见 scope 取值:
| scope 值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
|---|---|---|---|---|
compile(默认) |
✅ | ✅ | ✅ | log4j |
test |
❌ | ✅ | ❌ | junit |
provided |
✅ | ✅ | ❌ | servlet-api |
runtime |
❌ | ✅ | ✅ | jdbc 驱动 |
例如,给 JUnit 依赖设置 scope 为 test,代表该依赖只在测试程序中使用,主程序无法使用:
xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>

六、Maven 常见问题
问题现象: Maven 项目中添加的依赖未正确下载,造成右侧 Maven 面板中的依赖报红,再次 reload 重新加载也不会再下载。
产生原因: 由于网络原因,依赖没有下载完整,在 Maven 仓库中生成了 xxx.lastUpdated 文件------该文件不删除,就不会重新下载。


解决方案:
- 根据依赖坐标找到仓库中对应的
xxx.lastUpdated文件,删除后重新加载项目; - 通过命令
del /s *.lastUpdated批量递归删除指定目录下的xxx.lastUpdated文件,删除后重新加载项目; - 重新加载依赖后 Maven 面板可能仍报红,可关闭 IDEA 重新打开加载项目。
为了方便解决该问题,可以把 del.bat 批处理脚本拷贝到 Maven 安装目录下,双击即可递归删除该目录下所有 xxx.lastUpdated 文件。
结语
Maven 核心部分到这里就全部梳理完毕了。回顾一下这篇笔记的主线:
- 它是什么:管理和构建 Java 项目的工具(Apache 开源);
- 它能干什么:依赖管理(告别手动导 jar 包)、项目构建(一条命令完成编译/测试/打包/部署)、统一项目结构(跨工具通用);
- 怎么配置:解压安装 → 配置本地仓库 → 配置阿里云私服 → 配置环境变量 → IDEA 全局集成;
- 怎么管理依赖:坐标(groupId/artifactId/version)→ 依赖配置 → 依赖传递 → 排除依赖 → 生命周期;
- 怎么写测试:JUnit + 断言 + 常用注解 + 依赖范围(scope)。
这套「Maven 核心」是企业级 Java 开发的地基,后续学 Spring、SpringBoot 时,依赖管理、打包部署全都离不开它。如果这篇文章对你有帮助,欢迎点赞收藏~下一篇我们继续 Web 后端基础,一起把 JavaWeb 的地基打牢!
参考内容 heuqqdmbyk.feishu.cn/wiki/KTOKw4... 黑马磊哥