news 2026/5/1 5:22:43

【Maven】生命周期、依赖与继承

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Maven】生命周期、依赖与继承

生命周期

Maven的生命周期是对所有的构建过程进行抽象和统一。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。而在执行这些阶段时,实际的工作还是由插件来完成的。这种思想与设计模式中的模板方法非常相似。
Maven有三套相互独立的生命周期:
  • Clean:clean生命周期的目的是清理项目
  • Default:default生命周期的目的是构建项目
  • site:site生命周期的目的是建立项目站点。
完整生命周期:
用户在mvn命令后可以指定三个生命周期中的任何阶段,则Maven会按以下逻辑执行:首先会得到该阶段所属生命周期,从该生命周期中的第一个阶段开始按顺序执行,直至该阶段本身。例如执行mvn clean命令会依次执行clean生命周期中的pre-clean阶段及clean阶段。mvn命令后可以指定多个阶段,Maven会按照输入的顺序依次执行,每次执行都会按照之前描述的逻辑执行。
之前提到实际的工作还是由插件来完成的,这意味着插件需要和阶段绑定起来。Maven已经事先将很多核心插件绑定到对应的阶段,这样用户几乎不用配置就有构建Maven项目。

依赖传递和可选依赖

应用场景:

第一直接依赖: HelloFriend项目依赖Hello项目

第二直接依赖: MakeFriend项目依赖HelloFriend项目

如图所示 MakeFriend 项目只依赖了 HelloFriend,但是也把Hello依赖进来了

依赖范围对传递依赖的影响

传递依赖是会受到依赖范围的影响的,具体来看结果如下:

依赖阻断

例如我们在HelloFriend项目里面的Hello依赖处添加该配置

<optional>true</optional>

表示 HelloFriend 被其他项目依赖时,不传递 Hello 的依赖至依赖于 HelloFriend 的项目

可选依赖

如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖

Maven继承和聚合

继承的意义

继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全。比如我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的公共模块,比如说每个模块都需要javaseo-utils,在编译的时候,maven-compiler-plugin插件也要被引入,maven仓库地址以及发布目录都是相同的配置。我们可以使用Maven的继承功能,把公共的配置信息写到父模块中,子模块只要继承了该父模块,也会继承父模块的配置信息。

可继承的POM元素

groupId :项目组 ID ,项目坐标的核心元素;

version :项目版本,项目坐标的核心元素;

description :项目的描述信息;

organization :项目的组织信息;

inceptionYear :项目的创始年份;

url :项目的 url 地址

develoers :项目的开发者信息;

contributors :项目的贡献者信息;

distributionManagerment :项目的部署信息;

issueManagement :缺陷跟踪系统信息;

ciManagement :项目的持续继承信息;

scm :项目的版本控制信息;

mailingListserv :项目的邮件列表信息;

properties :自定义的 Maven 属性;

dependencies :项目的依赖配置;

dependencyManagement :醒目的依赖管理配置;

repositories :项目的仓库配置;

build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;

reporting :包括项目的报告输出目录配置、报告插件配置等。

父工程是MavenJava项目,只作依赖管理,src文件夹可以删掉,打包方式是 pom 包

创建子工程 hami_core,是 MavenJava 项目

创建子工程 hami_console,是 MavenJavaWeb 项目

出现 BUILD SUCCESS 即创建成功,添加 java 和 resources 文件夹,将其分别变为源码文件夹和资源文件夹,以及修改 web.xml 配置文件,如图:

按此模板创建 hami_portal 和 hami_file 子工程,父工程的pom文件如图:

继承的依赖管理

父类直接引用依赖,如果在父类的dependencies内直接引用依赖,则子类都会继承该依赖

父类通过dependencyManagement管理依赖,子类不会默认继承该依赖,但是当子类使用该依赖时无需考虑版本信息,直接继承父类dependencyManagement中设置的版本号(Version)

聚合管理

我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块、system系统模块、log日志模块、reports统计模块、monitor监控模块等等。这时我们肯定会出现这么一个需要,我们需要一次构件多个模块,而不用每个模块都去mvn;

以上面得父子项目为例,当我们对parent进行mvn install时,会对所有子项目均进行install操作

通过 properties元素用户可以定义一个或多个 maven 属性,然后在 maven 的其他地方使用 ${属性名称} 的方式引用该属性,这种做法的意义在于消除重复和统一管理。比如,需要在多个地方重复声明同样的 junit 版本,现在只需要在一个地方声明就可以。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 19:14:36

Docker部署Qwen3-8B与vLLM推理加速实战

Docker部署Qwen3-8B与vLLM推理加速实战 在消费级显卡上跑通一个真正能用的大语言模型&#xff0c;曾是许多开发者遥不可及的梦想。但随着Qwen3-8B这类高性价比模型的出现&#xff0c;以及vLLM等高效推理框架的成熟&#xff0c;如今只需一块RTX 4090&#xff0c;就能搭建出响应迅…

作者头像 李华
网站建设 2026/5/1 5:22:42

YOLO目标检测边界框回归原理解析

YOLO目标检测边界框回归原理解析 在工业视觉系统日益追求“实时精准”的今天&#xff0c;如何在毫秒级内完成复杂场景下的物体定位&#xff0c;成为算法设计的核心挑战。传统两阶段检测器如Faster R-CNN虽然精度高&#xff0c;但其区域建议网络&#xff08;RPN&#xff09;与后…

作者头像 李华
网站建设 2026/4/4 15:01:23

Python安装torchaudio时与GPT-SoVITS的版本匹配

Python安装torchaudio时与GPT-SoVITS的版本匹配 在部署 GPT-SoVITS 这类基于 PyTorch 的语音合成系统时&#xff0c;你是否曾遇到过这样的报错&#xff1f; AttributeError: module torchaudio has no attribute load或者更隐晦的问题&#xff1a;程序能跑起来&#xff0c;但…

作者头像 李华
网站建设 2026/5/1 4:39:17

【AcDbDimension 标注学习整理相关】

// 基础选择和对象获取 Acad::ErrorStatus es = Acad::eOk; AcGePoint3d ptPick; ads_name ename; if (acedEntSel(_T("选择一个标注: "), ename, asDblArray(ptPick)) != RTNORM)return;// 获取对象ID AcDbObjectId objId = AcDbObjectId::kNull; es = acdbGetObjec…

作者头像 李华
网站建设 2026/4/23 3:25:18

学术PPT制作设计公司哪家好?

如何选择专业的学术PPT制作设计公司&#xff1f;明确需求与预算是否全案定制设计&#xff0c;适合对逻辑性、视觉效果和演讲效果有极高要求的关键场合&#xff0c;如重大基金答辩、顶尖学术会议报告等。这通常意味着更高的预算和更长的沟通周期。根据自身需求&#xff0c;日常学…

作者头像 李华
网站建设 2026/5/1 5:00:23

USB设备厂商与产品代码查询表

USB设备厂商与产品代码查询表&#xff08;AI视频生成设备扩展&#xff09; http://www.linux-usb.org/usb.ids# # List of USB IDs # # Maintained by Stephen J. Gowdy <linux.usb.idsgmail.com> # If you have any new entries, please submit them via # …

作者头像 李华