Maven 详解

Maven 详解

Maven 是一个强大的项目管理和构建工具,主要用于 Java 项目。Maven 基于 Project Object Model (POM),通过描述项目结构、依赖关系、插件和构建生命周期,帮助开发者高效管理项目的构建过程。


1. Maven 的核心概念

1.1 POM(Project Object Model)
  • POM 是 Maven 的核心配置文件,位于项目的根目录,文件名为 pom.xml
  • 描述项目的基本信息、依赖关系、插件、构建规则等。
1.2 依赖管理
  • Maven 自动管理项目所需的库依赖,包括依赖的版本和传递依赖。
  • Maven 仓库 下载依赖库,减少手动处理的复杂性。
1.3 构建生命周期

Maven 定义了一系列构建阶段(Lifecycle),每个阶段执行特定任务:

  • 默认生命周期:包括清理、编译、测试、打包、部署等。
  • clean 生命周期:负责清理项目生成的临时文件。
  • site 生命周期:生成项目文档站点。
1.4 仓库

Maven 使用本地仓库和远程仓库存储依赖库和插件:

  • 本地仓库:位于开发者机器上,默认路径为 ~/.m2/repository
  • 中央仓库:Maven 官方提供的公共仓库,存储大量开源库。
  • 私服仓库:企业内部搭建的私有仓库(如 Nexus、Artifactory)。
1.5 插件(Plugins)
  • Maven 的功能通过插件扩展,如编译插件、测试插件、打包插件。
  • 常用插件:
    • maven-compiler-plugin:负责编译代码。
    • maven-surefire-plugin:运行单元测试。
    • maven-jar-plugin:打包为 JAR 文件。

2. Maven 的优点

  1. 依赖管理
    • 自动处理依赖及其传递依赖,避免手动下载和配置 JAR 文件。
  2. 标准化构建
    • 提供统一的项目目录结构和生命周期,降低学习成本。
  3. 高扩展性
    • 通过插件可以轻松扩展构建功能。
  4. 多模块支持
    • 可以管理大型项目中的多个子模块,简化协作开发。
  5. 社区支持
    • 拥有丰富的第三方插件和依赖库。

3. Maven 的目录结构

Maven 推荐的标准目录结构如下:

project/
├── src/
│   ├── main/
│   │   ├── java/            # Java 源代码
│   │   ├── resources/       # 资源文件
│   │   └── webapp/          # Web 应用资源
│   ├── test/
│   │   ├── java/            # 测试代码
│   │   └── resources/       # 测试资源文件
├── target/                  # 构建输出目录
└── pom.xml                  # Maven 配置文件

4. Maven 的工作流程

  1. 读取 POM 文件
    • Maven 根据 pom.xml 获取项目基本信息和依赖。
  2. 下载依赖
    • 检查本地仓库是否已有依赖库,如没有则从远程仓库下载。
  3. 执行生命周期
    • 根据目标任务(如 cleancompilepackage),依次执行相关阶段。
  4. 输出构建结果
    • 将编译后的代码、测试报告、打包文件存放到 target 目录。

5. POM 文件结构

一个简单的 pom.xml 示例:

<project xmlns="http://maven.apache.org/POM/4.0.0"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId>       <!-- 项目组 ID --><artifactId>my-app</artifactId>      <!-- 项目 ID --><version>1.0-SNAPSHOT</version>      <!-- 项目版本 --><packaging>jar</packaging>           <!-- 打包类型 --><dependencies>                       <!-- 依赖声明 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.10</version></dependency></dependencies><build>                              <!-- 构建配置 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source> <!-- 指定 Java 源码版本 --><target>1.8</target> <!-- 指定目标版本 --></configuration></plugin></plugins></build>
</project>

6. Maven 的构建命令

常用命令:
  1. 清理项目mvn clean
    • 删除 target 目录中的构建输出文件。
  2. 编译代码mvn compile
    • 编译主代码,生成 .class 文件。
  3. 运行测试mvn test
    • 运行单元测试(需要测试框架,如 JUnit)。
  4. 打包项目mvn package
    • 打包为 JAR 或 WAR 文件,输出到 target 目录。
  5. 安装到本地仓库mvn install
    • 将构建的包安装到本地仓库供其他项目使用。
  6. 验证依赖mvn dependency:tree
    • 显示依赖关系树,便于分析传递依赖。

7. 依赖管理详解

7.1 依赖范围(Scope)

Maven 支持以下依赖范围:

  1. compile(默认范围):编译、测试、运行时都需要。
  2. provided:只在编译和测试时需要,运行时由容器提供(如 Servlet API)。
  3. runtime:只在运行和测试时需要。
  4. test:仅测试时需要(如 JUnit)。
  5. system:本地系统依赖,必须手动提供路径。
7.2 传递依赖

Maven 自动处理依赖的依赖(传递依赖),例如:

  • A 依赖于 B,B 又依赖于 C,则 A 会自动依赖 C。
7.3 依赖冲突

当依赖的版本冲突时,Maven 默认使用最先声明的版本。可以通过 <dependencyManagement> 明确指定版本。


8. Maven 多模块项目

Maven 支持多模块项目,用于管理大型项目。

主项目 POM 文件:
<project><modules><module>module1</module><module>module2</module></modules>
</project>
子模块 POM 文件:
<project><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version></parent>
</project>

构建命令:

  • 构建所有模块:mvn install
  • 构建单个模块:mvn install -pl module1

9. 常见问题和解决方法

  1. 依赖下载失败

    • 检查网络连接或仓库地址配置。
    • 清理本地仓库缓存:mvn dependency:purge-local-repository
  2. 版本冲突

    • 使用 dependency:tree 分析冲突依赖。
    • 使用 <dependencyManagement> 指定统一版本。
  3. 构建失败

    • 检查 pom.xml 配置是否正确。
    • 查看详细日志:mvn -X

10. 总结

Maven 是 Java 开发中不可或缺的工具,极大地简化了依赖管理和项目构建过程。通过学习 Maven 的依赖管理、插件使用和构建生命周期,可以提升开发效率并规范项目管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升用户体验、创新产品与高效运营,企业发展三驾马车

​在当今竞争激烈的市场环境中&#xff0c;企业要想脱颖而出并持续发展&#xff0c;需同时在提升用户体验、推动产品创新以及实现内部高效运营方面下功夫。 提升用户体验至关重要。它能提高用户满意度和忠诚度&#xff0c;增加用户口碑与推荐&#xff0c;提升企业品牌形象。可通…

基于ZooKeeper搭建Hadoop高可用集群

ZooKeeper搭建Hadoop高可用集群 在之前安装的Hadoop3.3.6集群中HDFS NameNode 和 YARN ResourceManager 都是单节点&#xff0c;集群不具有高可用性。 HDFS 高可用架构 HDFS 高可用架构主要组件&#xff1a; Active NameNode 和 Standby NameNode&#xff1a; 两台 NameNode…

机器学习—学习过程

给定训练集构建决策树的过程有几个步骤。 给出了一组由十个猫和狗的例子组成的训练集&#xff0c;决策树学习的第一步是我们必须决定在根节点使用什么特性&#xff0c;这是决策树顶部的第一个节点&#xff0c;通过一个算法&#xff0c;假设我们决定选择根节点中的特性&#xf…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入一个n行m列的矩阵A&#xff0c;输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵A的行数和列数。…

GPT 1到4代的演进笔记

1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…

JDK17 下载与安装

下载安装包 针对不同的操作系统, 需要下载对应版本的 JDK. 如果电脑是 Windows32 位的, 建议重装系统, 重装成 64 位的操作系统. 因为 Java 从 9 版本开始, 就已经不提供 32 位版本的安装包了. 官网下载 官网下载链接 需要登录 Oracle 账号才能下载. 账号: 2872336204qq.c…

51c视觉~YOLO~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12512597 1、Yolo8 1.1、检测PCB元件 技术世界正在以惊人的速度发展&#xff0c;而这种转变的核心是一个革命性的工具 — 计算机视觉。它最有趣的应用之一是电子印刷电路板 &#xff08;PCB&#xff09; 的检测和分析。本文…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 &#xff0c;学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库&#xff0c;常见的内置库&#xff08;random、hashlib、json、时间、os&#xff09; 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Python库常用函数-数据分析

Python库常用函数 1.pandas库 &#xff08;1&#xff09;数据读取与写入 读取 CSV 文件&#xff1a; data pd.read_csv(file.csv)读取 Excel 文件&#xff1a; data pd.read_excel(file.xlsx, sheet_nameSheet1)写入 CSV 文件&#xff1a; data.to_csv(new_file.csv, ind…

RabbitMQ消息可靠性保证机制5--消息幂等性处理

RabbitMQ层面有实现“去重机制”来保证“恰好一次”吗&#xff1f;答案是没并没有&#xff0c;而且现在主流的消息中间件都没有实现。 一般解决重复消息的办法是&#xff1a;在消费端让我们消费消息操作具有幂等性。 幂等性问题并不是消息系统独有&#xff0c;而是&#xff0…

Day28 买卖股票的最佳时机 跳跃游戏 跳跃游戏 II K 次取反后最大化的数组和

贪心算法 part02 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 求最大利润 将每天的正利润加和 public int maxProfit(int[] prices) {int totalPrices 0;for(int i0;i<prices.length;i){if(i<prices.length-1&&prices[i1]>prices[…

MINDAGENT:游戏交互中的新兴性设计

一、摘要 1.问题/研究背景 LLM具有在多智能体系统中执行复杂调度的能力&#xff0c;并可以协调这些代理以完成需要广泛合作的复杂任务。 但是&#xff0c;目前还没有一个标准的游戏场景和相关的测试指标来评估 LLM 在游戏中的表现以及与人类玩家的合作能力。 2.研究目标/动…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…

『数据结构』空间复杂度

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

这就是AOP

AOP AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,它的目的是通过分离横切关注点(cross-cutting concerns)来提升代码的模块化程度,AOP 的概念最早是由 Xerox PARC 提出的,它并非站在 OOP 的对立面,而是对 OOP 的一个很好的补充。Spring Framework …

多模态COGMEN详解

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…

重生之我在异世界学编程之C语言:操作符篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文1. 算术操作符2. 关系&#xff0…

STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

基本定时器 基本定时器TIM6和TIM7各包含一个16位自动装载计数器&#xff0c;由各自的可编程预分频器驱动。 这2个定时器是互相独立的&#xff0c;不共享任何资源。 这个2个基本定时器只能向上计数&#xff0c;由于没有外部IO&#xff0c;所以只能计时&#xff0c;不能对外部…

git 常见使用

在使用 git 时&#xff0c;可以通过以下命令更新和拉取远程仓库的最新代码&#xff1a; 基本步骤 确保在正确的分支&#xff1a; 检查当前所在分支&#xff1a; git branch如果需要切换到其他分支&#xff1a; git checkout 分支名更新远程仓库信息&#xff1a; 拉取远程仓库的…