news 2026/7/13 17:13:20

【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/7/12 17:52:31

全球USB厂商与设备ID大全(2017年更新)

全球USB厂商与设备ID更新&#xff1a;AI视频生成设备的标准化接入 在智能硬件快速演进的今天&#xff0c;USB接口早已不再局限于传输数据或充电。越来越多具备专用计算能力的设备通过这一通用接口融入主流操作系统生态——从加密狗到AI加速棒&#xff0c;从虚拟串口到实时渲染…

作者头像 李华
网站建设 2026/7/13 0:03:25

ACE-Step:5秒生成原创音乐,重塑短视频创作

ACE-Step&#xff1a;5秒生成原创音乐&#xff0c;重塑短视频创作 在短视频日更成常态的今天&#xff0c;创作者早已习惯了“上午拍、下午剪、晚上爆”的节奏。但无论剪辑软件多智能、拍摄设备多先进&#xff0c;背景音乐始终是个绕不开的坎——想找一首不侵权又贴合情绪的BGM…

作者头像 李华
网站建设 2026/7/13 4:44:30

Anaconda部署Linly-Talker数字人对话系统

Anaconda部署Linly-Talker数字人对话系统 在虚拟助手、AI主播和智能客服日益普及的今天&#xff0c;如何让一个“会说话的头像”真正理解用户、自然表达并实时互动&#xff1f;Linly-Talker 给出了完整答案。这个开源项目将大语言模型&#xff08;LLM&#xff09;、语音识别&a…

作者头像 李华
网站建设 2026/7/13 4:58:19

K8s1.28.15网络插件Calico全解析

一、Calico 概述Calico 是一款开源的容器网络解决方案&#xff0c;基于 BGP&#xff08;边界网关协议&#xff09;实现容器间的网络互联&#xff0c;同时提供强大的网络策略&#xff08;Network Policy&#xff09;能力&#xff0c;用于控制容器间的访问权限。对于 Kubernetes …

作者头像 李华
网站建设 2026/7/12 23:41:18

Dify离线安装指南:从零部署AI应用平台

Dify离线部署实战&#xff1a;构建内网可用的AI应用平台 在企业级AI落地的过程中&#xff0c;一个常见的挑战是——如何在没有外网连接的环境中部署现代AI系统&#xff1f;尤其是在金融、政务、军工等对数据安全要求极高的场景下&#xff0c;直接访问公网拉取镜像不仅不可行&am…

作者头像 李华
网站建设 2026/7/13 7:44:56

TensorRT-LLM自定义算子开发全指南

TensorRT-LLM自定义算子开发全指南 在大模型推理部署的战场上&#xff0c;性能就是生命线。当你的 LLM 在 A100 或 H100 上运行时&#xff0c;是否曾因注意力机制不够稀疏、FFN 层未针对特定硬件优化而感到束手无策&#xff1f;开源框架提供了通用路径&#xff0c;但真正的极致…

作者头像 李华