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架构,但程序还是运行在本地工控机上的),我…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
