Maven核心概念
一、项目对象模型(POM)
1. 定义
POM(Project Object Model)是 Maven 项目的核心配置文件,它以 XML 格式描述了项目的基本信息、项目依赖、构建配置等。可以说,POM 是 Maven 理解和处理项目的基础。
2. 基本结构
- 项目信息:包括
<groupId>
、<artifactId>
和<version>
。这三个元素被称为项目的坐标,在 Maven 的仓库中唯一标识一个项目。<groupId>
:通常是项目的组织或公司的域名倒序,用于区分不同组织或项目。例如,com.example
表示example
项目属于com
组织。<artifactId>
:项目的名称,用于在同一组织内区分不同的项目模块。<version>
:项目的版本号,用于标识项目的不同发布版本。
- 依赖管理:通过
<dependencies>
标签来定义项目所依赖的其他库或模块。每个依赖都包含<groupId>
、<artifactId>
和<version>
,以便 Maven 能够准确地找到并下载所需的依赖。 - 构建配置:如
<build>
标签下可以配置编译器插件、资源目录、输出目录等构建相关的信息。例如,可以指定使用的 Java 版本<source>
和<target>
,以及编译插件<plugins>
等。
3. 作用
- 项目描述与识别:清晰地定义了项目的身份和基本属性,方便在团队协作、项目发布和依赖管理中准确识别和引用项目。
- 依赖管理:Maven 根据 POM 中的依赖配置,自动下载和管理项目所需的第三方库,确保项目在不同环境下都能获取到正确的依赖版本,避免了依赖冲突等问题。
- 构建流程控制:通过配置构建相关的信息,如编译、测试、打包等步骤的参数和插件,Maven 能够按照预定的流程构建项目,提高了构建的可重复性和自动化程度。
二、依赖管理
1. 依赖范围
Maven 的依赖具有不同的范围,用于控制依赖在项目构建生命周期中的作用范围。
- compile(默认范围):编译依赖范围,在项目的编译、测试和运行阶段都有效。例如,常用的 Java 类库依赖通常使用这个范围。
- test:仅在测试阶段有效,用于测试代码的编译和运行。比如 JUnit 等测试框架的依赖就是这个范围,在项目的正常运行时不需要这些依赖。
- provided:表示该依赖在运行时由容器或 JDK 提供,在编译和测试时需要,但在运行时不需要将其打包到最终的项目输出中。例如,Servlet API 在 Web 应用服务器中已经提供,项目在开发时需要依赖它进行编译和测试,但在部署到服务器时不需要将其包含在项目的 WAR 包中。
- runtime:在运行时有效,在编译时不需要。比如一些数据库驱动的依赖,只在项目运行时连接数据库时才需要。
2. 依赖传递
Maven 的依赖传递机制使得项目所依赖的库的依赖也会被自动引入到项目中。但这种传递是有规则的:
- 当 A 依赖 B,B 依赖 C 时,如果 B 对 C 的依赖范围是 compile,那么 A 在编译、测试和运行时都能使用 C。
- 如果 B 对 C 的依赖范围是 test,那么 C 只会在 A 的测试阶段被引入,在编译和运行时 A 无法使用 C。
- 如果 B 对 C 的依赖范围是 provided,那么 C 不会被传递到 A,因为它被认为在运行时已经由外部提供。
3. 依赖冲突解决
在复杂的项目中,可能会出现依赖冲突的情况,即不同的依赖库引入了不同版本的同一个第三方库。Maven 采用了以下策略来解决冲突:
- 最短路径优先原则:Maven 会选择依赖路径最短的版本。例如,项目 A 依赖 B,B 依赖 C(版本 1),同时项目 A 又直接依赖 C(版本 2),如果从 A 到 B 再到 C 的路径比 A 直接到 C 的路径长,那么 Maven 会选择版本 2 的 C。
- 声明优先原则:如果依赖路径长度相同,那么在 POM 中先声明的依赖版本会被优先使用。可以通过在 POM 中明确指定依赖版本来解决冲突,或者使用
<dependencyManagement>
标签来统一管理项目的依赖版本,确保项目使用的是期望的版本。
三、仓库
1. 本地仓库
Maven 在本地机器上有一个默认的本地仓库,用于存储项目下载的依赖库和项目构建生成的输出。当 Maven 构建项目时,首先会在本地仓库中查找所需的依赖,如果找不到,才会从远程仓库下载。本地仓库的默认位置在用户目录下的.m2
文件夹中。可以通过修改 Maven 的配置文件(settings.xml
)来更改本地仓库的位置。
2. 远程仓库
如果本地仓库中没有所需的依赖,Maven 会从远程仓库下载。远程仓库可以是 Maven 官方仓库,也可以是公司内部搭建的私有仓库。
- Maven 中央仓库:包含了大量的开源 Java 库和项目,是最常用的远程仓库之一。但由于网络等原因,在国内访问可能较慢。
- 私有仓库:企业或组织为了管理内部的自研库和特定版本的依赖,会搭建私有仓库。私有仓库可以提高依赖下载的速度和安全性,同时便于对内部依赖进行统一管理和版本控制。
Maven 在查找依赖时,会按照配置的仓库顺序依次查找,直到找到所需的依赖为止。可以在 POM 文件或settings.xml
中配置远程仓库的地址和相关认证信息(如果需要)。
四、生命周期
Maven 定义了一套完整的项目构建生命周期,包括编译、测试、打包、安装和部署等阶段。每个阶段都有特定的任务和目标,并且这些阶段是顺序执行的。
1. 主要阶段
- validate:验证项目是否正确且所有必要的信息是否可用。
- compile:编译项目的源代码。
- test:运行项目的测试代码。
- package:将编译后的代码打包成可分发的格式,如 JAR、WAR 等。
- verify:对集成测试的结果进行检查,以确保满足质量标准。
- install:将打包的项目安装到本地仓库,以供其他项目依赖使用。
- deploy:将项目部署到远程仓库或服务器上。
2. 生命周期的作用
- 标准化构建流程:为项目构建提供了一套统一的、可重复的流程,无论项目的规模和复杂程度如何,都可以按照相同的步骤进行构建。这使得开发团队成员之间的协作更加顺畅,减少了因为构建流程不一致而导致的问题。
- 插件执行机制:Maven 的生命周期与插件紧密结合,每个生命周期阶段都可以绑定特定的插件来执行具体的任务。例如,在编译阶段可以使用 Java 编译器插件,在打包阶段可以使用相应的打包插件。这种机制使得 Maven 具有高度的可扩展性和灵活性,可以通过插件来满足不同项目的构建需求。
- 自动化构建:通过命令行或集成开发环境(IDE)的集成,可以方便地触发 Maven 的构建生命周期,实现自动化构建。开发人员可以轻松地进行编译、测试、打包等操作,提高了开发效率。
五、插件
1. 插件的作用
Maven 插件是实现 Maven 功能扩展的关键组件。它们通过与 Maven 的生命周期阶段绑定,执行各种具体的任务,如编译代码、运行测试、打包项目、生成文档等。插件提供了丰富的功能,使得 Maven 能够适应不同类型项目的构建和管理需求。
2. 常用插件
- maven-compiler-plugin:用于编译 Java 源代码。可以通过配置插件来指定使用的 Java 版本、编译参数等。
- maven-surefire-plugin:用于运行项目的测试代码。它支持 JUnit 等测试框架,能够自动识别和执行测试类中的测试方法,并生成测试报告。
- maven-jar-plugin:用于将项目打包成 JAR 文件。可以配置 JAR 文件的名称、版本、包含的文件和目录等信息。
- maven-war-plugin:用于将 Web 项目打包成 WAR 文件。它会处理 Web 项目的资源文件、Servlet 配置等,确保 WAR 包能够正确部署到 Web 容器中。
- maven-site-plugin:用于生成项目的站点文档,包括项目概述、API 文档、测试报告等。可以通过配置插件来定制站点的布局和内容。
3. 插件的配置与使用
插件可以在 POM 文件中的<build>
标签下进行配置。例如,配置maven-compiler-plugin
插件来指定 Java 版本:
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins>
</build>
在命令行中执行 Maven 命令时,Maven 会根据生命周期阶段和插件配置自动调用相应的插件来执行任务。例如,执行mvn clean install
命令,Maven 会先调用maven-clean-plugin
执行清理操作,然后按照生命周期顺序依次执行编译、测试、打包等操作,其中在编译阶段会调用maven-compiler-plugin
进行源代码编译。
Maven 的核心概念相互关联、协同工作,为 Java 项目的开发和管理提供了强大的支持。通过理解和掌握这些核心概念,开发人员能够更加高效地利用 Maven 进行项目构建、依赖管理和团队协作,提高项目的开发质量和开发效率。希望本文对大家理解 Maven 的核心概念有所帮助,在实际项目开发中能够更好地运用 Maven 这一强大的工具。
相关文章:
Maven核心概念
一、项目对象模型(POM) 1. 定义 POM(Project Object Model)是 Maven 项目的核心配置文件,它以 XML 格式描述了项目的基本信息、项目依赖、构建配置等。可以说,POM 是 Maven 理解和处理项目的基础。 2. 基…...

Sonatype Nexus 部署手册
文章目录 一、前言二、软件环境2.1 版本变更:2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work ,并授…...

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风
TLV320AIC3104 是一款低功耗立体声音频编解码器,具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制,可实现立体声 48kHz DAC 回放,在 3.3V 模拟电源电压下的功耗低至 14mW࿰…...
(8)结构体、共用体和枚举类型数据
1. 结构体、共用体的定义及区别,typedef 定义别名 结构体的定义 结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起。例如,定义一个表示学生信息的结构体: // 定义结构体类型 struct Student struct Student {char name[20];int age;float score; };共…...

Jedis操作和springboot整合redis
Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…...
基于AI大模型的复杂扫描件PDF信息提取与规整
前言 场景大致是会上传一个几十页的扫描件PDF,让AI在当中找出我需要的字段,本文会隐去具体行业信息和具体的AI提示词内容,只分享技术相关内容,请见谅。 AI模型选择 针对我们行业的使用场景,我主要测试了GPT、Claude以…...
为什么https先非对称加密,然后对称加密?
HTTPS之所以先使用非对称加密,然后在对称加密,主要是基于两者在加密效率与安全性方面的特性考虑。 首先,非对称加密具有极高的安全性,因为它使用了公钥和私钥这一对密钥。公钥是公开的,任何人都可以使用它来加密数据&…...
【Coroutines】Full Understanding of Kotlinx.Corutines Framework
文章目录 What is CorutinesDifference between Corutine and ThreadFast UsageSuspend FunctionAdvanced Usage of CoroutineCoroutine EssentialsCoroutineContextCoroutineScopePredefined CoroutineScopePredefined DispatchersPredefined CoroutineStartJobCreate a Corou…...

Python面向对象,实现图片处理案例,支持:高斯模糊、Canny边缘检测、反转边缘图像、生成手绘效果、调亮度......等等
实验图片如下: 命名为img1.jpg, 放在项目下新建文件夹images下 项目构造如下: app.py源码如下 import cv2 import os from matplotlib import pyplot as plt import numpy as npclass ImageProcessor:def __init__(self, image_path):self.image cv…...

SOLID - 依赖倒置原则(Dependency Inversion Principle)
SOLID - 依赖倒置原则(Dependency Inversion Principle) 定义 依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的五大基本原则之一,通常缩写为SOLID中的D。DIP由Robert C. Martin提出&…...
【.NET 8 实战--孢子记账--从单体到微服务】--需求拆分与规划
在上一篇文章中我们收集了需求,并对需求进行了简单的分析和规划,但是对于开发人员来说,上一篇文章的需求还不够详细,并且没有形成计划。因此本篇文章将带领大家来拆分需求并规划开发里程碑。 一、详细需求列表 项目组进行了多次…...

在macOS的多任务处理环境中,如何平衡应用的性能与用户体验?这是否是一个复杂的优化问题?如何优化用户体验|多任务处理|用户体验|应用设计
目录 一 多任务处理与应用性能 1. macOS中的多任务处理机制 2. 性能优化的基本策略 二 用户体验的关键要素 1. 响应速度 2. 界面友好性 3. 功能的直观性 三 平衡性能与用户体验的策略 1. 资源管理 2. 优化数据加载 3. 使用合适的线程模型 4. 实时监测和调整 四 使…...

Vscode配置CC++编程环境的使用体验优化和补充说明
文章目录 快速编译运行👺code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)😊使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…...

十个方法杜绝CAD图纸泄密风险!2024年图纸防泄密指南!「必看」
随着信息技术的发展,CAD图纸的应用日益普遍,然而随之而来的图纸泄密风险也愈加严重。企业在提升效率的同时,更需重视信息安全。为此,本文将介绍十个有效的方法,帮助企业杜绝CAD图纸泄密风险,保障商业机密。…...

技术干货|HyperMesh CFD功能详解:虚拟风洞 Part 1
虚拟风洞VWT 从2023版本开始,虚拟风洞VWT(Virtual Wind Tunnel)模块合并到HyperMesh CFD中。 用户在VWT模块中完成LBM求解器ultraFluidX的前处理设置,导出参数文件XML和模型文件STL,并在GPU服务器上提交计算。 VWT目前…...

022集——统计多条线的总长度(CAD—C#二次开发入门)
如下图所示,选择多条线并统计长度: c#中不包含直接获取curve曲线长度 属性,需用如下方法:curve.GetDistanceAtParameter(item.EndParam) 附部分代码如下: using Autodesk.AutoCAD.ApplicationServices; using Autode…...

大模型重要技术系列三:高效推理
接上一篇高效训练,这一篇汇总下高效推理的方法。高效推理的两个主要优化目标是低延迟(快速得到推理结果)和高吞吐量(能同时处理很多请求),同时还要尽可能地少用资源(算力、存储、网络带宽&#…...
Android 刘海屏适配指南
如果您不希望您的内容与刘海区域重叠, 以确保您的内容不会与状态栏及 导航栏。如果您要呈现在刘海区域中,请使用 WindowInsetsCompat.getDisplayCutout() 检索 DisplayCutout 对象 包含每个刘海屏的安全边衬区和边界框。借助这些 API 您需要检查视频内容…...

微信小程序服务通知
项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…...

Ubuntu使用Qt虚拟键盘,支持中英文切换
前言 最近领导给了个需求,希望将web嵌入到客户端里面,做一个客户端外壳,可以控制程序的启动、停止、重启,并且可以调出键盘在触摸屏上使用(我们的程序虽然是BS架构,但程序还是运行在本地工控机上的),我…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...