当前位置: 首页 > news >正文

从0开始学习Java+AI知识点总结-15.后端web基础(Maven基础)

Maven 作为 Java 项目管理和构建的核心工具,早已成为后端开发的必备技能。无论是依赖管理、项目构建还是团队协作,Maven 都能大幅提升开发效率。本文将从基础概念到实战技巧,全面梳理 Maven 的核心知识点,帮你彻底掌握这一工具的使用。

一、Maven 核心概念与作用

1. 什么是 Maven?

Maven 是 Apache 旗下的开源项目,是一款专注于 Java 项目管理和构建的工具。它基于项目对象模型(POM),通过简洁的配置实现项目依赖管理、自动化构建和标准化结构定义,解决了传统开发中的依赖混乱、构建繁琐等问题。

2. Maven 的三大核心作用

(1)依赖管理:告别手动管理 Jar 包
  • 传统方式痛点:使用 Jar 包需手动从官网下载,复制到项目lib目录,易出现版本冲突、缺失依赖等问题。
  • Maven 解决方案:通过pom.xml文件配置依赖坐标,Maven 自动从仓库下载并管理 Jar 包,无需手动操作。

示例配置:

<dependency>

    <groupId>cn.hutool</groupId>

    <artifactId>hutool-all</artifactId>

    <version>5.8.27</version>

</dependency>

(2)项目构建:标准化自动化流程

Maven 提供跨平台(Windows/Linux/Mac)的自动化构建命令,覆盖项目开发全流程:

  • compile:编译源代码
  • test:运行单元测试
  • package:打包(生成 Jar/War 文件)
  • install:安装项目到本地仓库
  • deploy:部署项目到远程仓库

通过简单命令即可完成重复构建工作,无需手动执行编译、测试等步骤。

(3)统一项目结构:跨工具兼容

不同 IDE(如 IDEA、Eclipse)默认项目结构存在差异,导致项目迁移困难。Maven 定义了标准目录结构,无论使用何种工具,项目结构保持一致:

maven-project

├── src

│   ├── main          # 主程序代码

│   │   ├── java      # Java源代码

│   │   └── resources # 配置文件

│   └── test          # 测试代码

│       ├── java      # 测试源代码

│       └── resources # 测试配置文件

└── pom.xml           # Maven配置文件

二、Maven 核心模型与仓库

1. 核心模型

Maven 通过三大模型实现功能闭环:

  • 项目对象模型(POM):通过pom.xml描述项目信息(如坐标、依赖、构建配置等)。
  • 依赖管理模型:通过坐标定义项目依赖的 Jar 包,自动处理依赖传递。
  • 构建生命周期模型:定义标准化构建阶段(如编译、测试、打包),阶段按顺序执行,后续阶段依赖前置阶段。

2. 仓库:Jar 包的 "存储中心"

仓库是存储 Jar 包和插件的目录,分为三类:

仓库类型

说明

地址 / 位置

本地仓库

本地计算机的目录,缓存下载的 Jar 包

默认为${user.home}/.m2/repository,可自定义

中央仓库

Maven 团队维护的全球唯一仓库,包含绝大多数开源 Jar 包

Central Repository:

远程仓库(私服)

企业 / 团队自建的私有仓库,用于管理内部 Jar 包

企业内部服务器地址

依赖查找顺序

当项目引入依赖时,Maven 按以下顺序查找 Jar 包:

本地仓库 → 远程仓库(私服)→ 中央仓库

三、Maven 安装与配置

1. 下载与安装

  • 下载地址:Maven 中文网,选择最新版本的apache-maven-x.x.x-bin.zip
  • 安装步骤:解压到无中文 / 特殊字符的目录(如D:\develop\apache-maven-3.9.4),解压后目录结构如下:
    • bin:存放可执行命令(如mvn
    • conf:存放配置文件(核心为settings.xml
    • lib:Maven 自身依赖的 Jar 包

2. 关键配置

(1)配置本地仓库

修改conf/settings.xml,指定本地仓库路径:

<localRepository>D:\develop\apache-maven-3.9.4\mvn_repo</localRepository>

(2)配置阿里云私服

中央仓库在国外,下载速度慢,建议配置阿里云镜像:

settings.xml<mirrors>标签中添加:

<mirror>

    <id>alimaven</id>

    <name>aliyun maven</name>

    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

    <mirrorOf>central</mirrorOf>

</mirror>

(3)配置环境变量
  • 新增系统变量MAVEN_HOME,值为 Maven 安装目录(如D:\develop\apache-maven-3.9.4)。
  • Path中添加%MAVEN_HOME%\bin
  • 验证:命令行执行mvn -v,输出 Maven 版本信息即配置成功。
(4)可选:配置 JDK 版本

settings.xml<profiles>标签中添加,指定默认 JDK 版本:

<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>

    </properties>

</profile>

四、IDEA 集成 Maven

1. 全局配置

为避免每个项目重复配置,建议在 IDEA 全局设置中指定 Maven:

  1. 打开File → New Projects Setup → Settings for New Projects
  2. 进入Build, Execution, Deployment → Build Tools → Maven
  3. 配置:
    • Maven home path:Maven 安装目录
    • User settings file:选择conf/settings.xml并勾选Override
    • Local repository:本地仓库路径并勾选Override

2. 创建 Maven 项目

  1. 新建项目:File → New → Module,选择Maven,无需勾选骨架(除非需要快速生成特定结构)。
  2. 填写项目坐标(groupIdartifactIdversion),完成创建。
  3. 配置 JDK 版本:进入File → Project Structure,设置Project SDKLanguage level为目标 JDK 版本(如 17)。

3. POM 文件详解

pom.xml是 Maven 项目的核心配置文件,关键标签说明:

<?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模型版本,固定为4.0.0 -->

    <modelVersion>4.0.0</modelVersion>

    <!-- 项目坐标:唯一标识项目 -->

    <groupId>com.example</groupId> <!-- 组织名(如域名反写) -->

    <artifactId>demo-project</artifactId> <!-- 模块名 -->

    <version>1.0-SNAPSHOT</version> <!-- 版本号:SNAPSHOT(快照版)/RELEASE(发行版) -->

    <!-- 配置JDK版本和编码 -->

    <properties>

        <maven.compiler.source>17</maven.compiler.source> <!-- 编译JDK版本 -->

        <maven.compiler.target>17</maven.compiler.target> <!-- 运行JDK版本 -->

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 编码格式 -->

    </properties>

    <!-- 依赖列表 -->

    <dependencies>

        <!-- 示例:引入JUnit依赖 -->

        <dependency>

            <groupId>org.junit.jupiter</groupId>

            <artifactId>junit-jupiter</artifactId>

            <version>5.9.1</version>

            <scope>test</scope> <!-- 依赖范围 -->

        </dependency>

    </dependencies>

</project>

4. 导入 Maven 项目

当需要导入已有 Maven 项目时,可通过两种方式:

  • 方式 1:File → Project Structure → Modules → Import Module,选择项目的pom.xml
  • 方式 2:打开 IDEA 右侧Maven面板,点击+按钮,选择项目的pom.xml

五、依赖管理进阶

1. 依赖坐标

坐标是 Maven 中资源(项目、Jar 包、插件)的唯一标识,由三部分组成:

  • groupId:组织 / 公司名称(如org.springframework)。
  • artifactId:项目 / 模块名称(如spring-context)。
  • version:版本号(如6.1.4),分为SNAPSHOT(开发中,不稳定)和RELEASE(稳定发行版)。

2. 依赖传递与排除

(1)依赖传递

当项目 A 依赖 B,B 依赖 C 时,A 会自动依赖 C(传递性依赖),无需手动引入 C。例如:引入spring-context时,Maven 会自动下载其依赖的spring-corespring-beans等。

(2)排除依赖

若传递的依赖不需要(如冲突或无用),可通过<exclusions>排除:

<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>

3. 依赖范围

通过<scope>标签控制依赖的作用范围,常见取值:

scope 值

主程序(main)

测试程序(test)

打包(package)

说明

compile

默认值,全场景可用(如log4j

test

仅测试场景可用(如JUnit

provided

编译和测试时可用,运行时由环境提供(如servlet-api

runtime

编译不依赖,运行和测试依赖(如 JDBC 驱动)

六、Maven 生命周期与命令

1. 三大生命周期

Maven 定义了三套相互独立的生命周期,每套包含多个阶段:

  • clean:清理项目,阶段为pre-clean → clean → post-clean
  • default:核心构建流程,关键阶段:compile → test → package → install → deploy
  • site:生成项目站点文档,阶段为pre-site → site → post-site → site-deploy

2. 常用命令与执行

(1)命令执行规则
  • 执行某个阶段时,其前置阶段会自动执行(如执行package会先执行compiletest)。
  • 不同生命周期的阶段可组合执行(如mvn clean package:先清理再打包)。
(2)常用命令

命令

说明

mvn clean

清理 target 目录(删除编译、测试生成的文件)

mvn compile

编译 main 目录的源代码

mvn test

运行 test 目录的测试代码(需先编译)

mvn package

打包项目(生成 Jar/War 到 target 目录)

mvn install

将项目安装到本地仓库(供其他项目依赖)

(3)执行方式
  • IDEA 工具栏:右侧Maven面板展开项目,双击生命周期阶段即可执行。
  • 命令行:进入项目根目录(含pom.xml),直接执行命令。

七、单元测试与 JUnit

1. 测试阶段划分

软件测试按粒度分为:

  • 单元测试:测试最小功能单元(如方法),开发者自测。
  • 集成测试:测试单元间协作,开发者负责。
  • 系统测试:测试完整系统功能,测试人员负责。
  • 验收测试:验证是否满足用户需求,用户 / 需求方负责。

2. JUnit 快速入门

JUnit 是 Java 单元测试的主流框架,使用步骤:

(1)引入依赖

pom.xml中添加:

<dependency>

    <groupId>org.junit.jupiter</groupId>

    <artifactId>junit-jupiter</artifactId>

    <version>5.9.1</version>

    <scope>test</scope>

</dependency>

(2)编写测试代码

src/test/java下创建测试类(命名规范:XxxTest),测试方法需用@Test注解:

import org.junit.jupiter.api.Test;

public class CalculatorTest {

    @Test

    public void testAdd() {

        int result = new Calculator().add(2, 3);

        // 断言结果是否符合预期

        org.junit.jupiter.api.Assertions.assertEquals(5, result);

    }

}

3. 断言与常用注解

(1)断言方法

用于验证测试结果是否符合预期,常用断言:

  • assertEquals(exp, act):验证值相等
  • assertTrue(condition):验证条件为真
  • assertNotNull(obj):验证对象非空
(2)核心注解

注解

说明

@Test

标记测试方法

@BeforeEach

每个测试方法执行前运行(初始化资源)

@AfterEach

每个测试方法执行后运行(释放资源)

@BeforeAll

所有测试方法执行前运行(静态方法,全局初始化)

@AfterAll

所有测试方法执行后运行(静态方法,全局清理)

@ParameterizedTest + @ValueSource

参数化测试(同一方法多次运行,参数不同)

八、Maven 常见问题与解决方案

1. 依赖下载失败(报红)

  • 原因:网络问题导致依赖未完整下载,仓库中生成xxx.lastUpdated文件,阻止重新下载。
  • 解决
    1. 手动删除仓库中对应依赖的xxx.lastUpdated文件。
    2. 执行命令批量删除:del /s *.lastUpdated(Windows)或find . -name "*.lastUpdated" -delete(Linux/Mac)。
    3. 重新加载依赖(IDEA 中点击Reload All Maven Projects)。

2. 版本冲突

  • 现象:不同依赖传递引入同一 Jar 包的不同版本。
  • 解决
    1. mvn dependency:tree命令查看依赖树,找到冲突版本。
    2. 通过<exclusions>排除低版本或不兼容的依赖。

3. 编译版本不一致

  • 现象:项目编译时报版本不兼容错误。
  • 解决:在pom.xml<properties>中指定 JDK 版本(见前文 POM 配置)。

总结

Maven 通过标准化的依赖管理、构建流程和项目结构,极大简化了 Java 项目开发。掌握本文的核心知识点 —— 从安装配置、依赖管理到生命周期执行,能帮你高效解决开发中的构建问题。建议收藏本文,在实际开发中遇到问题时随时查阅,逐步熟练 Maven 的高级用法,提升开发效率。

如果觉得本文对你有帮助,欢迎点赞、收藏并关注,后续会分享更多 Java 开发实战技巧!

http://www.dtcms.com/a/333500.html

相关文章:

  • ARM Cortex-M7 Thread Mode与Handler Mode
  • Android ViewPager2+Fragment viewModelScope问题
  • 在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出
  • Java零基础笔记18(Java编程核心:Java网络编程—数据通信方案)
  • leetcode 刷题1
  • SysGetVariableString函数
  • 【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导
  • 详解 k 近邻(KNN)算法:原理、实践与调优 —— 以鸢尾花分类为例
  • JUC LongAdder并发计数器设计
  • 指针操作:从到*的深度指南
  • JavaWeb开发_Day13
  • Cortex-Debug和openocd之间的关系?如何协同工作?
  • 《人形机器人的觉醒:技术革命与碳基未来》——触觉反馈系统:电子皮肤的概念、种类、原理及在机器中的应用
  • 攻防世界—fakebook(两种方法)
  • docker重启或系统重启后harbor自动启动
  • 深入理解C++正则表达式:从基础到实践
  • ReasonRank:从关键词匹配到逻辑推理,排序准确性大幅超越传统方法
  • Apifox接口测试工具
  • Unity输入系统:旧版Input_System
  • 第四章:大模型(LLM)】06.langchain原理-(3)langchain 数据连接方法
  • kubernetes(4) 微服务
  • 前往中世纪 送修改器(Going Medieval)免安装中文版
  • AI大模型配置项
  • 【mysql数据库全部重点知识】
  • 企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
  • 昆仑万维重磅发布Mureka V7.5与MoE-TTS,AI音乐与语音合成再升级!
  • 嵌入式学习 day52 IMX6ULL裸机开发-I2C
  • 基于Spring Boot的智能民宿预订与游玩系统设计与实现 民宿管理系统 民宿预订系统 民宿订房系统
  • 蓝桥杯 二叉树
  • [ CSS 前端 ] 网页内容的修饰