当前位置: 首页 > news >正文

【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 版本,现在只需要在一个地方声明就可以。

http://www.cnnetsun.cn/news/86963.html

相关文章:

  • EBS后台查询人员职责信息
  • Qwen3-8B-AWQ性能优化与最佳实践
  • LLaMA-Factory 微调 DeepSeek-R1 模型实战指南
  • Langflow自定义组件开发与界面集成详解
  • LobeChat能否协助撰写简历?求职者福音来了
  • 使用Miniconda创建Python 3.8环境的完整步骤
  • 搭建Ollama并运行qwen,简单RAG实现
  • LobeChat能否显示用量统计?透明化消费展示
  • 解决langchain-chatchat缺少__init__.py问题
  • Linly-Talker:能对答如流的AI数字人
  • YOLOv5网络结构解析与代码实现
  • 使用线性回归算法预测房价
  • gpt-oss-20b微调与扩展全指南
  • 「ECG信号处理——(29)基于分层分类的ECG心律失常检测系统设计与实现」2025年12月16日
  • FaceFusion报错:未检测到源人脸
  • Tigshop 开源商城系统 【商品预售功能】上新!全款+定金双模式深度适配全行业经营需求
  • YOLOv8官方文档中文解读:新手必读
  • 基于深度学习的植物病害检测系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)
  • Stable Diffusion 3.5本地部署指南与一键整合包
  • Wan2.2-T2V-A14B本地部署与多GPU推理指南
  • 基于深度学习的跌倒检测系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)
  • 构建个性化AI助手:LobeChat + 开源大模型完美组合
  • 免费守护网站安全:精选一年期SSL证书获取攻略
  • 私有化部署AI知识库——Anything-LLM企业级解决方案详解
  • 如何利用PaddlePaddle和清华源快速搭建高性能NLP训练环境
  • NVIDIA TensorRT镜像安装包下载与CUDA安装全攻略
  • kotaemon配置全解析:轻松定制文档问答系统
  • ACE-Step:开源生成式AI音乐模型解析
  • Seed-Coder-8B-Base能否辅助编写Istio AuthorizationPolicy?
  • Langflow本地部署:解决pip安装卡顿问题