从零认识 Maven:依赖管理 + 项目构建 + 单元测试知识点全梳理(附 IDEA 实操)

从零认识 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.apache.org/

Maven 的作用(官方表述):

  1. 方便的依赖管理;
  2. 统一的项目结构;
  3. 标准的项目构建流程。

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-maven-3.9.4-bin.zip(解压即安装)

建议解压到没有中文、特殊字符的路径下(例如 E:\develop)。解压后目录结构:

目录 作用
bin 存放可执行命令(mvn 命令重点关注)
conf 存放 Maven 的配置文件(settings.xml 后期需要修改)
lib 存放 Maven 依赖的 jar 包(Maven 本身也是 Java 开发的)

② 配置本地仓库

  1. 在计算机上新建一个目录(本地仓库,用来存储 jar 包);
  2. 进入 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 环境变量类似:

  1. 在系统变量中新建 MAVEN_HOME,值为 Maven 的解压安装目录:
  1. 在 Path 中追加 %MAVEN_HOME%\bin:
  1. 打开 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 项目

全局设置(对所有项目生效)
  1. 进入 IDEA 欢迎页,选择 File → close project → Customize → All settings(注意:如果是全局配置,要在关闭项目后的欢迎页操作,而不是在某个项目里):
  1. 打开 All settings,选择 Build,Execution,Deployment → Build Tools → Maven:
  1. 配置工程的编译版本为 17:

这里设置的 Maven 环境信息不针对任何具体 project,属于全局配置;以后新建 project 默认就使用这套配置。

创建项目
  1. 创建一个空项目,命名为 web-project01(可在欢迎页 New Project 中创建);
  2. 进入项目后设置 JDK 版本号:点击小齿轮,选择 Project Structure;
  3. 创建模块:选择 Java 语言 + Maven,填写模块基本信息:
  1. 在 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 依赖,具体三步:

  1. 在 pom.xml 中编写 <dependencies> 标签;
  2. 在 <dependencies> 中使用 <dependency> 引入坐标;
  3. 定义坐标的 groupId、artifactId、version。
xml 复制代码
<dependencies>
    <!-- 依赖 : spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.1.4</version>
    </dependency>
</dependencies>

配置完成后点击刷新按钮,引入最新加入的坐标:

注意事项:

  1. 如果引入的依赖在本地仓库中不存在,会连接远程/中央仓库下载(过程可能比较耗时,耐心等待);
  2. 如果不知道依赖的坐标信息,可以到 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 工具栏中提供了快速访问通道:

执行方式有两种:

  1. 在 IDEA 中执行:在右侧 Maven 工具栏选择对应的生命周期,双击执行;
  2. 在命令行中执行 :打开 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 方法中进行,存在三个问题:

  1. 测试代码与源代码未分开,难维护;
  2. 一个方法测试失败,影响后面方法;
  3. 无法自动化测试、得到测试报告。

而使用 JUnit 单元测试框架后:

  1. 测试代码与源代码分开,便于维护;
  2. 可根据需要进行自动化测试;
  3. 可自动分析测试结果、产出测试报告。

入门程序: 使用 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 文件------该文件不删除,就不会重新下载。

解决方案:

  1. 根据依赖坐标找到仓库中对应的 xxx.lastUpdated 文件,删除后重新加载项目;
  2. 通过命令 del /s *.lastUpdated 批量递归删除指定目录下的 xxx.lastUpdated 文件,删除后重新加载项目;
  3. 重新加载依赖后 Maven 面板可能仍报红,可关闭 IDEA 重新打开加载项目。

为了方便解决该问题,可以把 del.bat 批处理脚本拷贝到 Maven 安装目录下,双击即可递归删除该目录下所有 xxx.lastUpdated 文件。


结语

Maven 核心部分到这里就全部梳理完毕了。回顾一下这篇笔记的主线:

  1. 它是什么:管理和构建 Java 项目的工具(Apache 开源);
  2. 它能干什么:依赖管理(告别手动导 jar 包)、项目构建(一条命令完成编译/测试/打包/部署)、统一项目结构(跨工具通用);
  3. 怎么配置:解压安装 → 配置本地仓库 → 配置阿里云私服 → 配置环境变量 → IDEA 全局集成;
  4. 怎么管理依赖:坐标(groupId/artifactId/version)→ 依赖配置 → 依赖传递 → 排除依赖 → 生命周期;
  5. 怎么写测试:JUnit + 断言 + 常用注解 + 依赖范围(scope)。

这套「Maven 核心」是企业级 Java 开发的地基,后续学 Spring、SpringBoot 时,依赖管理、打包部署全都离不开它。如果这篇文章对你有帮助,欢迎点赞收藏~下一篇我们继续 Web 后端基础,一起把 JavaWeb 的地基打牢!

参考内容 heuqqdmbyk.feishu.cn/wiki/KTOKw4... 黑马磊哥

相关推荐
Bazingga1 小时前
多智能体编排:拆分、隔离与收敛的完整实战
后端·agent·ai编程
geovindu1 小时前
rust: Template Method Pattern
开发语言·后端·设计模式·rust·行为模式·模板方法模
BingoGo1 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
后端·php
星轨zb2 小时前
[专题5]支付发放物品的一致性保障:事务、幂等与状态流转
数据库·后端·mongodb·支付架构学习
JaguarJack2 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
后端·php·服务端
vipxieliang2 小时前
Go 泛型结构体与约束进阶:从自定义约束到标准库泛型 API 实战
后端·go
isfox2 小时前
Python 文件操作:读写文件这件事,记住 with open 就够了
后端
武子康2 小时前
虚拟线程不是无限并发:Java Agent 后端真正该限制的是这些资源
人工智能·后端·agent