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

Maven精讲

文章目录

  • 一、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. 安装步骤

  1. 下载 Maven:从 Apache Maven 官网 下载最新版本(如 apache-maven-3.8.1-bin.zip)。
  2. 解压安装:解压到指定目录(如D:\apache-maven-3.8.1)。
  3. 配置环境变量
    • 添加MAVEN_HOME指向安装目录。
    • %MAVEN_HOME%\bin添加到PATH环境变量。
  4. 验证安装:命令行执行mvn -v,显示版本信息即安装成功。
    • 输出的Java版本信息反映了Maven运行所依赖的JDK版本,而非项目编译或运行时的目标Java版本。
    • 不同版本的Maven对JDK有不同的最低要求。例如,Maven 3.8.x及以上版本需要JDK 1.7或更高版本运行。
    • 如果要修改mvn -v输出的Java版本,需要更改JAVA_HOME环境变量,使其指向所需的JDK路径。

2. 仓库配置

  1. 配置本地仓库
    • 运行maven命令,会在用户目录下自动创建本地仓库 C:\Users<用户名>.m2\repository,随着项目开发下载构件至本地仓库,文件会越来越大,占用大量C盘空间,这里在D盘创建文件夹repository,并配置本地仓库路径
  2. 中央仓库
    • 这个仓库由 Maven 社区管理。
    • 无需显式配置,默认地址:https://repo.maven.apache.org/maven2/。
    • 需要通过网络才能访问。
  3. 配置远程仓库
    • 由于中央仓库在国外,所以下载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表示最新稳定版。RELEASE1.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.xmlindex.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>坐标项目版本(支持SNAPSHOT1.0.0-SNAPSHOT
<packaging>项目类型打包格式(默认jarjar/war/pom/ear
<name>元信息项目显示名称My Application
<description>元信息项目描述A demo project
<url>元信息项目主页 URLhttps://example.com
依赖管理
<dependencies>依赖依赖列表容器包含多个<dependency>
<dependency>依赖单个依赖定义包含groupIdartifactIdversion等子标签可选
<scope>依赖依赖作用域(默认compilecompile/test/provided/runtime
<optional>依赖是否可选依赖(默认falsetrue/false
<exclusions>依赖排除传递性依赖包含<exclusion>列表
构建配置
<build>构建构建配置容器包含插件、资源等配置
<plugins>构建插件列表容器包含多个<plugin>
<plugin>构建单个插件定义需指定groupIdartifactId(如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>(需指定nameemail
<contributors>人员贡献者列表类似<developers>
<issueManagement>管理问题跟踪系统配置定义url(如https://github.com/issues

五、Maven 的三大生命周期

Maven 的生命周期分为 Clean、Default(Build) 和 Site 三类,每个生命周期由多个阶段(Phase)组成,按顺序执行。

1. Clean 生命周期

作用:清理项目生成的临时文件(如target目录)。
包含阶段

  1. pre-clean:执行清理前的准备工作。
  2. clean:删除target目录(默认阶段)。
  3. post-clean:执行清理后的收尾工作。

常用命令

mvn clean# 执行 clean 阶段(清理 target 目录)

2. Default(Build)生命周期

作用:构建项目(编译、测试、打包、安装等),是最常用的生命周期。
关键阶段(按顺序执行):

阶段说明
validate验证项目配置是否正确(如检查pom.xml)。
compile编译主源代码(src/main/javatarget/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 生命周期

作用:生成项目文档和站点报告(如代码质量分析、测试覆盖率等)。
包含阶段

  1. pre-site:生成站点前的准备工作。
  2. site:生成项目文档(默认阶段,输出到target/site)。
  3. post-site:生成站点后的收尾工作。
  4. site-deploy:将站点部署到服务器(如 GitHub Pages)。

常用命令

mvn site# 生成项目文档mvn site-deploy# 部署站点到远程服务器

4. 关键注意事项

  1. 阶段顺序:Maven 生命周期阶段是顺序执行的,例如mvn package会隐式执行validatecompiletestpackage
  2. 跳过测试:使用-DskipTests跳过测试(如mvn package -DskipTests)。
  3. 指定版本:通过versions-maven-plugin批量修改版本号(如mvn versions:set -DnewVersion=1.1.0)。
  4. 依赖分析:用mvn dependency:tree检查依赖冲突(如[WARNING] Dependency conflict)。
  5. 多模块项目:在根目录执行命令会递归应用到所有子模块(如mvn clean install)。

六、快照(SNAPSHOT)

在 Maven 中,快照(Snapshot) 是一种特殊的版本号机制,主要用于 开发阶段 的依赖管理。它的核心作用是 允许项目动态引用其他模块的最新开发版本,而无需频繁修改版本号。

1.使用场景

一个大型的软件应用通常包含多个模块,并且通常的场景是多个团队开发同一应用的不同模块。举个例子,设想一个团队开发应用的前端,项目为 app-ui(app-ui.jar:1.0),而另一个团队开发应用的后台,使用的项目是>2. 快照vs正式版本号

特性快照(Snapshot)正式版本号
稳定性不稳定,可能随时变化(开发中频繁修改)。稳定,发布后不可更改(生产环境专用)。
版本号格式必须包含-SNAPSHOT后缀(如1.0.0-SNAPSHOT)。无特殊后缀(如1.0.02.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-RELEASE2.1.3-BETA正式版本的变体(如发布版、测试版),但行为仍固定。

4.总结

对比项快照(Snapshot)正式版本号
稳定性不稳定(开发中)稳定(生产环境)
更新方式自动检查更新手动更新版本号
使用场景开发、测试、CI生产、发布、长期依赖
仓库类型快照仓库(可覆盖)发布仓库(不可覆盖)
版本号后缀-SNAPSHOT无(或-RELEASE/-BETA等标签)
http://www.jsqmd.com/news/731932/

相关文章:

  • 5分钟上手MouseTester:你的鼠标性能测试专家指南
  • 如何在3分钟内免费为视频添加专业字幕:VideoSrt完整指南
  • 2026年过半,ZDNET读者购买最多的热门产品清单来了!
  • R语言做LLM偏见检测,你还在用`prop.test()`?——2024最新面试真题:多组敏感属性嵌套Logistic回归+多重比较校正(Bonferroni vs. BH)实战对比
  • S32K3双核MCU实战:手把手教你用MCAL配置两路独立LIN通信(附中断调试代码)
  • 2026北京国际车展:AI上车、算力军备赛,汽车行业格局重塑!
  • 专业音频路由解决方案:Synchronous Audio Router如何解决Windows多应用音频同步难题
  • Nintendo Switch游戏文件管理终极指南:NSC_BUILDER完整教程
  • ComfyUI-AnimateDiff-Evolved终极指南:5个核心技巧打造专业级AI动画
  • 观察 Taotoken 在全球多个节点下的 API 调用延迟与稳定性表现
  • 2026最权威的五大降重复率工具实测分析
  • 突破网盘下载瓶颈:LinkSwift直链解析工具的技术革新与应用实践
  • RT-Thread FinSH控制台保姆级使用指南:从串口连接到自定义命令实战
  • 微信免费去水印小程序推荐:2026 实测哪个安全好用?微信里去水印的小程序怎么选? - 科技热点发布
  • 终极指南:用QKeyMapper在Windows上实现跨设备按键映射
  • 解决中文字体版权与性能难题的开源方案:思源宋体TTF实战深度应用
  • 如何彻底清理Mac应用残留文件?Pearcleaner为你提供终极解决方案
  • Cadence Allegro设置stroke手势命令(以显示网络飞线为例子)
  • 从Numpy老手到PyTorch新手:关于Tensor的reshape,你需要切换的3个思维定式
  • 告别手动计算!用Google Earth Engine和MODIS数据一键批量导出2000-2022年植被覆盖度(FVC)
  • 在线一键去水印工具推荐:免费在线去水印工具哪个好用?2026 实测全平台盘点 - 科技热点发布
  • Uni-Mol技术深度解析:从3D分子表示到药物发现的完整工具链
  • Composer依赖冲突致AI服务崩溃,Laravel 12升级后OpenAI/Anthropic SDK失效全解析,深度定位到vendor/autoload.php第17行钩子劫持
  • 别再为传参发愁了!SAP ABAP中CL_HTTP_CLIENT发送POST请求的三种数据格式详解(JSON/Form-data/x-www-form-urlencoded)
  • 思源宋体TTF:7款免费中文宋体的终极配置与应用指南
  • 3分钟完成Axure中文界面设置:终极免费汉化指南
  • 金融虚假信息检测中LLM行为偏差与MFMD-Scen基准研究
  • Hermes Agent 自定义提供商配置指向 Taotoken 聚合端点的教程
  • 多能互补微电网关键技术的应用案例
  • 抖音视频怎么在线去水印?抖音视频在线去水印方法实测+2026 在线去水印工具推荐 - 科技热点发布