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架构,但程序还是运行在本地工控机上的),我…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...