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架构,但程序还是运行在本地工控机上的),我…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
