Maven

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.xmlMaven 全局配置文件
本地仓库路径(本机目录)

片段代码案例

<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 依赖或重启项目
评论