文章目录
- 一、Maven 简介
- 二、Maven 安装与配置
- 1. 安装步骤
- 2. 仓库配置
- 3. 构件下载一半失败的情况
- 三、创建 Maven 项目
- 1. 使用命令创建项目
- 2. **Maven `archetype:generate` 参数表**
- 3. 项目模板
- 4. 项目结构
- 四、认识POM
- 1. 查看effective pom
- 2. POM 标签大全
- 五、Maven 的三大生命周期
- **1. Clean 生命周期**
- **2. Default(Build)生命周期**
- **3. Site 生命周期**
- 4. 关键注意事项
- 六、快照(SNAPSHOT)
- 1.使用场景
- **2. 快照vs正式版本号**
- **3. 版本号示例对比**
- **4.总结**
一、Maven 简介
Maven 是 Apache 旗下的一个开源项目管理工具,主要用于 Java 项目的构建、依赖管理和文档生成。它通过一个标准化的项目结构和一个 XML 文件(pom.xml)来管理项目的生命周期,解决了传统构建工具(如 Ant)配置复杂、依赖管理困难等问题。其核心功能包括:
- 标准化项目结构:自动生成统一、标准的项目目录结构,降低学习成本。
- 依赖管理:自动处理项目所需第三方库的下载、版本冲突解决和传递性依赖管理。
- 项目构建:提供clean、compile、test、package、install等标准化生命周期流程。
- 信息管理:通过pom.xml集中管理项目配置、构建规则和文档生成。
- 多模块支持:支持父子POM结构实现大型项目拆分管理。
- 插件扩展:通过插件实现编译、测试、打包等任务。
二、Maven 安装与配置
1. 安装步骤
- 下载 Maven:从 Apache Maven 官网 下载最新版本(如 apache-maven-3.8.1-bin.zip)。
- 解压安装:解压到指定目录(如
D:\apache-maven-3.8.1)。 - 配置环境变量:
- 添加
MAVEN_HOME指向安装目录。 - 将
%MAVEN_HOME%\bin添加到PATH环境变量。
- 添加
- 验证安装:命令行执行
mvn -v,显示版本信息即安装成功。- 输出的Java版本信息反映了Maven运行所依赖的JDK版本,而非项目编译或运行时的目标Java版本。
- 不同版本的Maven对JDK有不同的最低要求。例如,Maven 3.8.x及以上版本需要JDK 1.7或更高版本运行。
- 如果要修改mvn -v输出的Java版本,需要更改JAVA_HOME环境变量,使其指向所需的JDK路径。
2. 仓库配置
- 配置本地仓库:
- 运行maven命令,会在用户目录下自动创建本地仓库 C:\Users<用户名>.m2\repository,随着项目开发下载构件至本地仓库,文件会越来越大,占用大量C盘空间,这里在D盘创建文件夹repository,并配置本地仓库路径
- 运行maven命令,会在用户目录下自动创建本地仓库 C:\Users<用户名>.m2\repository,随着项目开发下载构件至本地仓库,文件会越来越大,占用大量C盘空间,这里在D盘创建文件夹repository,并配置本地仓库路径
- 中央仓库
- 这个仓库由 Maven 社区管理。
- 无需显式配置,默认地址:https://repo.maven.apache.org/maven2/。
- 需要通过网络才能访问。
- 配置远程仓库
- 由于中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。
- 由于中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。
3. 构件下载一半失败的情况
当Maven依赖包下载到一半失败时,通常是由于网络中断、仓库服务器问题或本地缓存损坏等原因导致,此时会生成以.lastUpdated为扩展名的临时文件,阻碍后续重新下载。
删除.lastUpdated文件
手动删除:
- 找到本地Maven仓库路径。
- 搜索所有以
.lastUpdated结尾的文件并删除。例如:find~/.m2/repository-name"*.lastUpdated"-delete - 或使用Windows批处理脚本(
clearLastUpdated.bat):@echo off set REPO_PATH=%USERPROFILE%\.m2\repository for /r "%REPO_PATH%" %%i in (*.lastUpdated) do del "%%i" pause
强制更新:
- 在命令行中添加
-U参数,强制Maven检查更新并重新下载:mvn cleaninstall-U
- 在命令行中添加
三、创建 Maven 项目
1. 使用命令创建项目
下面图中等同于执行以下命令
mvn archetype:generate -DgroupId=com.example -DartifactId=my-first-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeVersion=RELEASE
2.Mavenarchetype:generate参数表
| 参数 | 作用 | 示例值 | 用途说明 |
|---|---|---|---|
-DgroupId | 指定项目的 Java 包名(Group ID),通常为域名反向写法。 | com.example | 唯一标识项目所属组织,作为 Maven 依赖坐标的一部分。 |
-DartifactId | 指定项目名称(Artifact ID),通常是模块名或应用名。 | my-first-app | 唯一标识项目模块,生成的构件(如 JAR)默认命名为artifactId-version.jar。 |
-DarchetypeArtifactId | 指定使用的 Maven 原型(Archetype),决定项目结构和内容。 | maven-archetype-quickstart | 快速生成标准项目结构(如含App.java主类的 Java 项目)。 |
-DinteractiveMode | 是否启用交互模式(true/false)。 | false | 关闭交互模式,直接使用命令行参数生成项目,适合自动化脚本。 |
-DarchetypeVersion | 指定原型的版本号,RELEASE表示最新稳定版。 | RELEASE或1.4 | 确保项目结构与特定原型版本兼容。 |
-Dversion | 指定项目的初始版本号(默认为1.0-SNAPSHOT)。 | 1.0.0 | 定义项目的版本,用于依赖管理和发布。 |
-Dpackage | 覆盖groupId指定具体的包名(需与groupId兼容)。 | com.example.myapp | 自定义代码的包路径(如主类放在com.example.myapp而非com.example)。 |
-DoutputDirectory | 指定项目生成的目录路径(默认为当前目录)。 | /tmp/projects | 控制项目文件的输出位置。 |
3. 项目模板
DarchetypeArtifactId用于指定 Maven 原型的标识符,不同的值代表不同类型的项目模板。以下是一些常见的DarchetypeArtifactId值及其用途的表格展示:
| DarchetypeArtifactId | 用途说明 |
|---|---|
maven-archetype-quickstart | 生成一个基本的 Java 项目,包含App.java主类和 JUnit 测试类。适合初学者快速上手。 |
maven-archetype-webapp | 生成一个简单的 Java Web 应用项目,包含web.xml和index.jsp文件。 |
maven-archetype-archetype | 用于创建一个新的 Maven 原型项目本身。适合需要自定义项目模板的用户。 |
maven-archetype-j2ee-simple | 生成一个简化的 J2EE 应用结构,适合传统的企业级应用开发。 |
maven-archetype-plugin | 生成一个 Maven 插件项目的模板,用于开发自定义的 Maven 插件。 |
maven-archetype-site | 生成一个 Maven 站点项目,支持文档生成(如 APT、XDoc、FML 等格式)。 |
maven-archetype-site-simple | 生成一个简化的 Maven 站点项目模板,适合基本的文档需求。 |
maven-archetype-portlet | 生成一个 JSR-268 Portlet 应用模板,适合门户应用开发。 |
maven-archetype-simple | 生成一个最小的 Maven 项目,仅包含基本结构,无额外依赖或代码。 |
4. 项目结构
my-first-app/ ├── pom.xml # Maven 项目配置文件 ├── src/ │ ├── main/ # 主代码目录 │ │ └── java/ # Java 源代码 │ │ └── com/example/App.java # 自动生成的示例类 │ └── test/ # 测试代码目录 │ └── java/ # 测试类 │ └── com/example/AppTest.java # 自动生成的测试类四、认识POM
- POM ( Project Object Model,项目对象模型 ) 是 Maven 的核心配置文件,采用 XML 格式,默认命名为 pom.xml。
- 所有的 POM 都继承自一个父(Super)POM(无论是否显式定义了这个父 POM)。父POM是 Maven 默认的 POM。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 https://repo.maven.apache.org/maven2 去下载。
- Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被重写。
1. 查看effective pom
- 使用以下命令来查看完整的pom配置:
mvn help:effective-pom
2. POM 标签大全
以下是整合后的pom.xml标签分类详解表格,涵盖基础信息、依赖管理、构建配置、环境配置、多模块管理及其他信息六大类,包含标签、类别、说明、示例/可选值及是否必需的详细说明:
| 标签 | 类别 | 说明 | 示例/可选值 | 是否必需 |
|---|---|---|---|---|
| 基础信息 | ||||
<modelVersion> | 项目结构 | POM 模型版本(固定值) | 4.0.0 | 是 |
<groupId> | 坐标 | 组织标识(反向域名) | com.example | 是 |
<artifactId> | 坐标 | 项目名称 | my-project | 是 |
<version> | 坐标 | 项目版本(支持SNAPSHOT) | 1.0.0-SNAPSHOT | 是 |
<packaging> | 项目类型 | 打包格式(默认jar) | jar/war/pom/ear | 否 |
<name> | 元信息 | 项目显示名称 | My Application | 否 |
<description> | 元信息 | 项目描述 | A demo project | 否 |
<url> | 元信息 | 项目主页 URL | https://example.com | 否 |
| 依赖管理 | ||||
<dependencies> | 依赖 | 依赖列表容器 | 包含多个<dependency> | 否 |
<dependency> | 依赖 | 单个依赖定义 | 包含groupId、artifactId、version等子标签 | 可选 |
<scope> | 依赖 | 依赖作用域(默认compile) | compile/test/provided/runtime | 否 |
<optional> | 依赖 | 是否可选依赖(默认false) | true/false | 否 |
<exclusions> | 依赖 | 排除传递性依赖 | 包含<exclusion>列表 | 否 |
| 构建配置 | ||||
<build> | 构建 | 构建配置容器 | 包含插件、资源等配置 | 否 |
<plugins> | 构建 | 插件列表容器 | 包含多个<plugin> | 否 |
<plugin> | 构建 | 单个插件定义 | 需指定groupId和artifactId(如maven-compiler-plugin) | 可选 |
<resources> | 构建 | 资源文件配置 | 定义<resource>路径(如src/main/resources) | 否 |
<testResources> | 构建 | 测试资源文件配置 | 类似<resources>(如src/test/resources) | 否 |
<finalName> | 构建 | 最终打包文件名(不含版本) | my-app | 否 |
| 环境配置 | ||||
<properties> | 配置 | 自定义变量容器(可通过${key}引用) | 定义键值对(如<java.version>11</java.version>) | 否 |
<java.version> | 属性 | Java 版本变量(常见于 Spring Boot) | 11/17 | 否 |
<repositories> | 仓库 | 自定义远程仓库列表 | 包含<repository>(如 Nexus 私有仓库) | 否 |
<pluginRepositories> | 仓库 | 自定义插件仓库 | 类似<repositories> | 否 |
| 多模块管理 | ||||
<modules> | 模块 | 子模块列表(聚合项目必需) | 包含多个<module>(如<module>module-a</module>) | 聚合项目需要 |
<parent> | 继承 | 父 POM 引用(继承项目必需) | 需指定父项目坐标(如<groupId>com.example</groupId>) | 继承项目需要 |
<dependencyManagement> | 依赖 | 统一管理依赖版本(不直接引入依赖) | 定义版本号(如<spring.version>5.3.8</spring.version>) | 否 |
<profiles> | 配置 | 环境配置容器(如开发/生产环境) | 包含<profile>(如<id>dev</id>) | 否 |
| 其他信息 | ||||
<licenses> | 法律 | 许可证信息 | 包含<license>(如Apache-2.0) | 否 |
<developers> | 人员 | 开发者列表 | 包含<developer>(需指定name和email) | 否 |
<contributors> | 人员 | 贡献者列表 | 类似<developers> | 否 |
<issueManagement> | 管理 | 问题跟踪系统配置 | 定义url(如https://github.com/issues) | 否 |
五、Maven 的三大生命周期
Maven 的生命周期分为 Clean、Default(Build) 和 Site 三类,每个生命周期由多个阶段(Phase)组成,按顺序执行。
1. Clean 生命周期
作用:清理项目生成的临时文件(如target目录)。
包含阶段:
- pre-clean:执行清理前的准备工作。
- clean:删除
target目录(默认阶段)。 - post-clean:执行清理后的收尾工作。
常用命令:
mvn clean# 执行 clean 阶段(清理 target 目录)2. Default(Build)生命周期
作用:构建项目(编译、测试、打包、安装等),是最常用的生命周期。
关键阶段(按顺序执行):
| 阶段 | 说明 |
|---|---|
| validate | 验证项目配置是否正确(如检查pom.xml)。 |
| compile | 编译主源代码(src/main/java→target/classes)。 |
| test | 运行单元测试(src/test/java),生成测试报告(target/surefire-reports)。 |
| package | 打包项目(根据packaging生成jar/war/pom等文件到target目录)。 |
| verify | 运行集成测试,验证打包结果是否符合标准。 |
| install | 将打包文件安装到本地仓库(~/.m2/repository),供其他项目依赖。 |
| deploy | 将打包文件部署到远程仓库(如 Nexus 或 Maven Central)。 |
常用命令:
mvn compile# 编译主代码mvntest# 编译并运行测试(不打包)mvn package# 编译、测试并打包(生成 target/xxx.jar)mvninstall# 打包并安装到本地仓库mvn deploy# 打包并部署到远程仓库3. Site 生命周期
作用:生成项目文档和站点报告(如代码质量分析、测试覆盖率等)。
包含阶段:
- pre-site:生成站点前的准备工作。
- site:生成项目文档(默认阶段,输出到
target/site)。 - post-site:生成站点后的收尾工作。
- site-deploy:将站点部署到服务器(如 GitHub Pages)。
常用命令:
mvn site# 生成项目文档mvn site-deploy# 部署站点到远程服务器4. 关键注意事项
- 阶段顺序:Maven 生命周期阶段是顺序执行的,例如
mvn package会隐式执行validate→compile→test→package。 - 跳过测试:使用
-DskipTests跳过测试(如mvn package -DskipTests)。 - 指定版本:通过
versions-maven-plugin批量修改版本号(如mvn versions:set -DnewVersion=1.1.0)。 - 依赖分析:用
mvn dependency:tree检查依赖冲突(如[WARNING] Dependency conflict)。 - 多模块项目:在根目录执行命令会递归应用到所有子模块(如
mvn clean install)。
六、快照(SNAPSHOT)
在 Maven 中,快照(Snapshot) 是一种特殊的版本号机制,主要用于 开发阶段 的依赖管理。它的核心作用是 允许项目动态引用其他模块的最新开发版本,而无需频繁修改版本号。
1.使用场景
一个大型的软件应用通常包含多个模块,并且通常的场景是多个团队开发同一应用的不同模块。举个例子,设想一个团队开发应用的前端,项目为 app-ui(app-ui.jar:1.0),而另一个团队开发应用的后台,使用的项目是>2. 快照vs正式版本号
| 特性 | 快照(Snapshot) | 正式版本号 |
|---|---|---|
| 稳定性 | 不稳定,可能随时变化(开发中频繁修改)。 | 稳定,发布后不可更改(生产环境专用)。 |
| 版本号格式 | 必须包含-SNAPSHOT后缀(如1.0.0-SNAPSHOT)。 | 无特殊后缀(如1.0.0、2.1.3-RELEASE)。 |
| 修改权限 | 可以重复部署同一快照版本(覆盖旧文件)。 | 发布后禁止修改,需升级版本号(如1.0.1)。 |
| 依赖更新 | 自动检查更新(默认每天一次,可通过-U强制)。 | 手动更新(需显式修改版本号)。 |
| 构建行为 | 每次构建可能下载不同内容的快照文件。 | 每次构建使用相同版本的固定文件。 |
| 缓存机制 | 本地仓库的快照文件可能被覆盖(无强一致性保证)。 | 本地仓库的正式版本文件永久保留。 |
| 开发阶段 | ✅ 推荐使用(多模块协作、频繁迭代)。 | ❌ 禁止使用(需稳定依赖)。 |
| 生产环境 | ❌ 禁止使用(可能导致不可预测的行为)。 | ✅ 必须使用(确保行为一致)。 |
| 依赖第三方未发布功能 | ✅ 可临时依赖快照版本测试新特性。 | ❌ 需等待正式发布或使用其他分支版本。 |
| 持续集成(CI) | ✅ 适合(每次构建使用最新代码)。 | ❌ 不适合(需固定版本保证可复现性)。 |
| 部署仓库 | 需部署到快照仓库(如 Nexus 的snapshots仓库)。 | 需部署到发布仓库(如 Nexus 的releases仓库)。 |
| 文件保留策略 | 快照仓库通常保留所有历史快照文件(可配置清理策略)。 | 发布仓库仅保留最新版本文件(旧版本需手动管理)。 |
| 元数据 | 快照版本的maven-metadata.xml包含时间戳和构建号(如1.0.0-20231001.123456-1)。 | 正式版本的元数据仅包含版本号(如1.0.0)。 |
3. 版本号示例对比
| 版本类型 | 示例 | 说明 |
|---|---|---|
| 快照版本 | 1.0.0-SNAPSHOT | 开发中版本,可能每天变化,内容不稳定。 |
| 正式版本 | 1.0.0 | 首次发布版本,稳定且不可修改。 |
| 修订版本 | 1.0.1 | 修复1.0.0的 Bug 后发布的新版本。 |
| 带标签版本 | 1.0.0-RELEASE、2.1.3-BETA | 正式版本的变体(如发布版、测试版),但行为仍固定。 |
4.总结
| 对比项 | 快照(Snapshot) | 正式版本号 |
|---|---|---|
| 稳定性 | 不稳定(开发中) | 稳定(生产环境) |
| 更新方式 | 自动检查更新 | 手动更新版本号 |
| 使用场景 | 开发、测试、CI | 生产、发布、长期依赖 |
| 仓库类型 | 快照仓库(可覆盖) | 发布仓库(不可覆盖) |
| 版本号后缀 | -SNAPSHOT | 无(或-RELEASE/-BETA等标签) |