Maven
理论篇
-
概述
- Maven:Apache 基金会的开源“项目管理与构建工具”,用于依赖管理、标准化构建、统一项目结构。
- 基于 POM(Project Object Model,项目对象模型)描述项目,通过少量配置完成构建、报告与文档。
-
Maven 的三个作用
- 依赖管理:用坐标统一管理第三方 Jar 包,自动下载、解析依赖传递,避免版本冲突。
- 项目构建:提供标准化、跨平台的一键构建命令(compile、test、package、install、deploy)。
- 统一项目结构:约定目录结构(src/main/java、src/test/java、resources…),不同 IDE 可互通导入。
-
Maven 模型
- 项目对象模型(POM):用 groupId/artifactId/version 三元坐标唯一标识项目与资源。
- 依赖管理模型(Dependency):在 pom.xml 中用坐标声明依赖,支持传递与排除、作用范围控制等。
- 构建生命周期(Lifecycle & Phases):三套生命周期(clean、default、site),阶段有序,实际工作由插件完成。
-
仓库
- 本地仓库:本机目录,缓存依赖与插件。
- 中央仓库:官方公共仓库(https://repo1.maven.org/maven2/)。
- 远程仓库(私服):公司内部搭建,查找顺序:本地 → 私服 → 中央。
- 依赖解析流程:先查本地,无则远程下载至本地后引用。
-
安装与配置
- 解压安装包(建议路径无中文与空格)。
- 修改 conf/settings.xml:
- 配置本地仓库 。
- 配置镜像(推荐阿里云)。
- 可选:配置 JDK 版本的 profile。
- 配置系统环境变量:MAVEN_HOME 与 PATH(%MAVEN_HOME%\bin),mvn -v 验证。
-
IDEA 集成 Maven
- 在 All settings → Build Tools → Maven 设置 Maven home、User settings、Local repository,配置工程 JDK 版本。
- 创建 Maven 模块,默认约定目录结构:
- src/main/java 与 src/main/resources
- src/test/java 与 src/test/resources
- target 用于编译与打包产物
- 右侧 Maven 面板可刷新依赖、执行生命周期。
-
生命周期(常用阶段)
- clean:清理上次构建的产物
- compile:编译主源码
- test:运行单元测试
- package:打包(jar/war)
- install:安装到本地仓库
- 说明:同一生命周期内执行后置阶段会自动执行其前置阶段;不同生命周期彼此独立(如 clean 与 package 不在同一套内)。
-
单元测试(JUnit5)
- 测试类型:单元测试、集成测试、系统测试、验收测试;
方法:白盒、黑盒、灰盒。 - 优势:测试代码与源代码分离、可自动化、可生成报告。
- 规范:测试类命名 XxxxTest,方法 public void testXxx() 搭配 @Test。
- 断言:Assertions.assertEquals/NotEquals/Same/True/False…
- 常用注解:@BeforeEach、@AfterEach、@BeforeAll、@AfterAll、@ParameterizedTest、@ValueSource、@DisplayName。
- 依赖范围(scope):控制依赖在主/测/打包的可见性(如 JUnit 配置 scope=test)。
- 测试类型:单元测试、集成测试、系统测试、验收测试;
-
常见问题(.lastUpdated)
- 现象:由于网络等原因下载中断后生成 xxx.lastUpdated 文件,导致依赖不再重新下载。
- 解决:删除 maven 仓库内的 xxx.lastUpdated 文件(可用 del /s *.lastUpdated),重载依赖或重启 IDEA。
代码篇
安装与本地仓库配置
作用/概念简述
- 指定本地仓库路径以缓存依赖,提升下载速度与稳定性。
通用模版
<!-- conf/settings.xml 中配置本地仓库 -->
<settings>
<localRepository>E:\maven-repo</localRepository>
<!-- 其他配置 -->
</settings>
属性/知识点表格
配置项 | 说明 |
---|---|
settings.xml | Maven 全局配置文件 |
本地仓库路径(本机目录) |
片段代码案例
<settings>
<localRepository>D:\dev\repo-maven</localRepository>
</settings>
配置阿里云镜像
作用/概念简述
- 使用国内镜像源加速依赖下载。
通用模版
<!-- conf/settings.xml 的 <mirrors> 内添加 -->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
属性/知识点表格
标签 | 说明 |
---|---|
镜像列表 | |
central | 对中央仓库生效 |
片段代码案例
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
配置 JDK 版本 Profile(可选)
作用/概念简述
- 统一编译/运行 JDK 版本,避免团队环境不一致。
通用模版
<profiles>
<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>
</profiles>
属性/知识点表格
属性 | 说明 |
---|---|
activeByDefault | 默认激活 |
maven.compiler.* | Maven Compiler 插件编译/目标版本 |
片段代码案例
<profiles>
<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>
</profiles>
POM 基础骨架
作用/概念简述
- POM 描述 Maven 项目的核心信息(坐标、构建属性等)。
通用模版
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo-project</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
属性/知识点表格
标签 | 说明 |
---|---|
groupId | 组织名(域名反写) |
artifactId | 模块名 |
version | 版本号(SNAPSHOT/RELEASE) |
properties | 编译版本与编码等 |
片段代码案例
<groupId>com.itheima</groupId>
<artifactId>maven-project01</artifactId>
<version>1.0-SNAPSHOT</version>
添加依赖(Dependency)
作用/概念简述
- 通过坐标引入第三方 Jar 包,自动下载并管理。
通用模版
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>xxx</artifactId>
<version>x.y.z</version>
</dependency>
</dependencies>
属性/知识点表格
点 | 说明 |
---|---|
依赖仓库 | 本地/私服/中央 |
刷新依赖 | IDEA 右侧 Maven 刷新按钮 |
搜索依赖 | https://mvnrepository.com/ 或 IDEA 搜索框 |
片段代码案例
<dependencies>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
</dependency>
</dependencies>
依赖传递与排除依赖(Exclusions)
作用/概念简述
- 依赖具有传递性;可通过 exclusions 主动断开某些传递来的依赖。
通用模版
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.4</version>
<exclusions>
<exclusion>
<groupId>group.to.exclude</groupId>
<artifactId>artifact-to-exclude</artifactId>
</exclusion>
</exclusions>
</dependency>
属性/知识点表格
概念 | 说明 |
---|---|
依赖传递 | A→B,B→C ⇒ A 同时拥有 C |
排除依赖 | 断开指定传递依赖(无需写版本) |
片段代码案例
<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>
依赖范围(scope)
作用/概念简述
- 控制依赖的可见范围(主程序、测试、打包)。
通用模版
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
属性/知识点表格
scope | 主程序(main) | 测试(test) | 参与打包 |
---|---|---|---|
compile(默认) | 是 | 是 | 是 |
test | 否 | 是 | 否 |
provided | 是 | 是 | 否 |
runtime | 否 | 是 | 是 |
片段代码案例
<!-- JUnit5 仅在测试范围有效 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
构建生命周期与命令
作用/概念简述
- 通过 Maven 命令执行标准化构建(清理、编译、测试、打包、安装)。
通用模版
mvn clean
mvn compile
mvn test
mvn package
mvn install
属性/知识点表格
阶段 | 说明 |
---|---|
clean | 清理 |
compile | 编译主代码 |
test | 执行测试 |
package | 打包(jar/war) |
install | 安装至本地仓库 |
片段代码案例
# 在 Maven 项目目录中执行
mvn package
# 等价于执行 compile 和 test 之后再打包
JUnit5 入门(测试类与断言)
作用/概念简述
- 在 test 目录中编写测试类,通过注解与断言实现单元测试,可视化通过/失败。
通用模版
// pom.xml 已加入 junit-jupiter 依赖 scope=test
import org.junit.jupiter.api.*;
public class UserServiceTest {
@BeforeAll
static void beforeAll(){ /* 全局初始化 */ }
@BeforeEach
void before(){ /* 每个用例前 */ }
@Test
void testXxx(){
// 断言
Assertions.assertEquals(1, 1);
}
@AfterEach
void after(){ /* 每个用例后 */ }
@AfterAll
static void afterAll(){ /* 全局清理 */ }
}
属性/知识点表格
注解/类 | 说明 |
---|---|
@Test | 标记测试方法 |
@BeforeEach/@AfterEach | 每个用例前/后 |
@BeforeAll/@AfterAll | 全局前/后(static) |
@DisplayName | 显示名称 |
@ParameterizedTest/@ValueSource | 参数化测试 |
Assertions | 断言工具类 |
片段代码案例
import org.junit.jupiter.api.*;
@DisplayName("测试-学生业务操作")
public class UserServiceTest {
@DisplayName("测试-获取性别")
@Test
public void testGetGender(){
String gender = new UserService().getGender("612429198904201611");
Assertions.assertEquals("男", gender);
}
@DisplayName("测试-参数化性别")
@ParameterizedTest
@ValueSource(strings = {"612429198904201611","612429198904201631","612429198904201626"})
public void testGetGender3(String id){
String gender = new UserService().getGender(id);
System.out.println(gender);
}
}
常见问题处理(xxx.lastUpdated)
作用/概念简述
- 依赖下载中断导致 .lastUpdated 文件残留,需删除后重试下载。
通用模版
:: 在仓库目录中批量删除
del /s *.lastUpdated
属性/知识点表格
文件 | 说明 |
---|---|
*.lastUpdated | 中断标记,存在时不会重试下载 |
片段代码案例
1) 关闭 IDEA
2) 到本地仓库目录执行:del /s *.lastUpdated
3) 回到 IDEA,刷新 Maven 依赖或重启项目