新手入门之高级maven

文章目录

  • 前言
  • 一、分模块设计与开发
    • Maven 分模块设计的优势
    • Maven 分模块设计的基本结构
    • Maven 分模块项目的构建
  • 二、继承与聚合
    • 三种打包方式:
    • Maven 父模块和子模块的关系
    • Maven 中的版本锁定
      • 1.<dependencyManagement> 标签
        • 主要特点:
      • 2.使用 <properties> 标签
    • Maven 的聚合
      • 聚合的特点
      • 聚合与继承的区别
        • 聚合的应用场景
  • 总结


前言

提示:本文章主要分享关于maven的一些进阶的知识与用法,需要对maven有一定基础。

通过这篇文章《新手入门之初识maven》可以带你对maven有个基本认识和使用,更好的阅读理解本文章。


一、分模块设计与开发

在 Maven 中,分模块设计(Multi-module Project)是一种常用的设计模式,可以将大型项目分解成多个小的、可管理的模块,每个模块可以独立编译、构建和部署。

Maven 分模块设计的优势

模块化: 将大项目拆分成小的、可管理的模块,便于团队协作和代码维护。
依赖管理: 模块之间可以定义依赖关系,方便依赖的管理和版本控制。
构建灵活性: 可以单独构建某个模块,也可以构建整个项目。
可重用性: 模块可以被多个项目共享和重用。
构建速度: 通过增量构建和缓存机制,加快构建速度。

Maven 分模块设计的基本结构

一个典型的 Maven 多模块项目通常包含一个父模块(Parent Module)和一个或多个子模块(Child Modules)。父模块通常包含整个项目的构建配置,如依赖管理、插件配置等,而子模块则包含具体的代码和资源文件。
目录结构示例

my-parent-project/
├── pom.xml  # 父模块的 POM 文件
├── module-a/  # 子模块 A
│   └── pom.xml  # 子模块 A 的 POM 文件
├── module-b/  # 子模块 B
│   └── pom.xml  # 子模块 B 的 POM 文件
└── module-c/  # 子模块 C└── pom.xml  # 子模块 C 的 POM 文件

Maven 分模块项目的构建

构建单个模块:
使用 mvn clean install 命令构建单个模块。
构建整个项目:
进入父模块目录,使用 mvn clean install 命令构建整个项目。

二、继承与聚合

视频推荐:黑马maven高级
Maven 继承允许一个项目(子项目)继承另一个项目(父项目)的配置。这意味着子项目可以继承父项目的 POM 文件中的许多配置项,包括依赖管理、构建插件配置以及其他元数据。这样可以避免重复配置,使得配置更加一致和易于维护。
一个项目只能继承一个父工程。

三种打包方式:

jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
war:普通web程序打包,需要部署在外部的tomcat服务器中运行
pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
注意: 父工程中设置的打包方式为pom,因为默认是jar.

Maven 父模块和子模块的关系

继承关系:
子模块可以继承父模块的配置,如依赖、插件配置等。
子模块的 POM 文件中通过 标签指定父模块的位置。
依赖关系:
子模块之间可以相互依赖,通过 标签指定依赖关系。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

父模块的 POM 文件示例

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>module-a</module><module>module-b</module><module>module-c</module></modules><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.4</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

子模块的 POM 文件示例

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>my-parent-project</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>module-a</artifactId><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

Maven 中的版本锁定

版本锁定是指在软件项目中明确指定依赖项的版本,以确保在构建和运行过程中使用的依赖项版本是一致的。这有助于:

避免依赖冲突: 确保项目中的所有依赖项都是兼容的,避免不同版本的依赖项之间的冲突。
确保可重现性: 确保每次构建的结果都是一样的,不受外部环境变化的影响。
提高稳定性: 通过固定版本号,可以减少因依赖项更新带来的潜在风险。

在 Maven 中,dependencies 和 dependencyManagement 是两个不同的元素,它们各自承担着不同的职责。
dependencies 元素用于声明项目直接依赖的库。这些依赖会被实际添加到项目的类路径中,并在构建过程中被下载和使用。
dependencyManagement 元素用于集中管理依赖项的版本。它通常出现在父项目的 POM 文件中,用于统一管理子项目中使用的依赖项版本。

1. 标签

在 Maven 中,可以使用 dependencyManagement 标签来集中管理依赖项的版本号。这样,在子模块或其他依赖声明中,只需要指定依赖项的坐标,而不需要指定版本号,版本号将从 dependencyManagement 中继承。

主要特点:

版本管理: 用于集中管理依赖项的版本,子项目可以引用而不必指定版本号。
非直接依赖: 声明的依赖不会被直接添加到类路径中,而是作为版本管理的参考。
子项目引用: 子项目可以在 dependencies>中引用 dependencyManagement中声明的依赖项,而不必指定版本号。
可选性: 不是必须的,但用于统一管理版本非常有用。
在这里插入图片描述

2.使用 标签

在 Maven 中,还可以使用 标签来自定义属性存储版本号,然后在依赖声明中引用这些属性。这种方式使得版本号的管理更加灵活和集中。

Maven 的聚合

在 Maven 中,聚合指的是在一个父项目(Parent Project)中定义多个子项目(Child Projects)。父项目本身不包含任何实际的源代码,它的主要作用是作为一个管理入口,用于统一管理和构建多个子项目。
它允许将多个相关的子项目(模块)组织在一起,并通过一个父项目来统一管理和构建这些子项目。聚合可以显著简化大型项目的管理和构建流程。

聚合的特点

组织结构: 聚合项目本身没有实际的代码,但包含了子项目的列表。
构建管理: 通过父项目可以一次性构建所有的子项目。
依赖管理: 虽然聚合项目本身不包含源代码,但它可以定义依赖管理、构建插件等配置,这些配置可以被子项目继承。
可扩展性: 随着项目的发展,可以方便地添加或移除子项目。

父项目 POM 文件示例:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!-- 列出所有子项目的相对路径,也就是需要聚合的模块 --><modules><module>child-project-a</module><module>child-project-b</module><module>child-project-c</module></modules><!-- 集中管理依赖项的版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.4</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 定义构建插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

子项目的 POM 文件通常会继承父项目的配置,并添加具体的依赖和插件配置。
子项目 POM 文件示例:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>child-project-a</artifactId><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

构建整个项目: 进入父项目的目录,执行 Maven 命令来构建整个项目。这样命令会递归地构建所有子项目,并执行相应的生命周期阶段。

聚合与继承的区别

虽然聚合和继承在 Maven 中经常一起使用,但它们的功能有所不同:
在这里插入图片描述

**聚合:**通过父项目的 元素来组织和管理多个子项目。
**继承:**子项目通过 元素继承父项目的配置。

聚合的应用场景

聚合特别适用于以下场景:

多模块项目: 将一个大型项目拆分成多个小的、可管理的模块。
微服务架构: 每个服务作为一个独立的子项目,通过父项目统一管理。
组件化开发: 将项目划分为不同的功能模块或组件,通过父项目管理这些组件。

总结

本文章对于maven的进阶用法做了一些简单的介绍,可以帮助新手在学习时maven和springboot时,对于项目的构建管理部署有一定的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题 - 图论

1 | bfs/dfs | 网格染色 200. 岛屿数量 访问到马上就染色&#xff08;将visited标为 true)auto [cur_x, cur_y] que.front(); 结构化绑定&#xff08;C17&#xff09;也可以不使用 visited数组&#xff0c;直接修改原始数组时间复杂度: O(n * m)&#xff0c;最多将 visited 数…

基于GPT的智能客服落地实践

&#x1f4cd;前言 在日常生活中&#xff0c;「客服」这个角色几乎贯穿着我们生活的方方面面。比如&#xff0c;淘宝买东西时&#xff0c;需要客服帮你解答疑惑。快递丢失时&#xff0c;需要客服帮忙找回。报名参加培训课程时&#xff0c;需要客服帮忙解答更适合的课程…… 基…

重构商业生态:DApp创新玩法与盈利模式的深度剖析

随着区块链技术的发展&#xff0c;DApp&#xff08;去中心化应用&#xff09;正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础&#xff0c;结合智能合约&#xff0c;逐步改变传统商业运作模式&#xff0c;创造新的市场生态。本文将从DApp的独特优势、创新玩法和…

找不到包的老版本???scikit-learn,numpy,scipy等等!!

废话不多说 直接上链接了&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/xxx/ 后面的这个xxx就是包的名字 大家需要什么包的版本&#xff0c;直接输进去就可以啦 举个栗子&#…

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步&#xff1a;编写汇编源程序2. 第二步&#xff1a;对源程序进行编译连接3. 第三步&#xff1a;执行可执行文件中的程序结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程…

9. JSON RPC 服务

① JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。 ② 在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTTP 协议来传输,或直接基于 TCP 协议来传输。 一、服务中心 目前 Hyperf 仅支持两种服务中心的组件支持: consul、nacosconsul 安…

了解 .NET 8 中的定时任务或后台服务:IHostedService 和 BackgroundService

IHostedService.NET 8 引入了使用和管理后台任务的强大功能BackgroundService。这些服务使长时间运行的操作&#xff08;例如计划任务、后台处理和定期维护任务&#xff09;可以无缝集成到您的应用程序中。本文探讨了这些新功能&#xff0c;并提供了实际示例来帮助您入门。您可…

Visual Studio配置tinyfiledialogs

下载地址&#xff1a;github下载链接 将下载的文件解压后&#xff0c;打开VS添加现有项 将.c文件添加进去 然后将tinyfiledialogs.h文件路径添加到包含目录 使用时包含头文件即可&#xff1a; #include <tinyfiledialogs.h>

上海亚商投顾:沪指缩量震荡 风电、传媒股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天缩量震荡&#xff0c;三大指数集体收涨&#xff0c;北证50则跌超7%&#xff0c;超80只北交所个股跌逾…

一文搞定图

图 图 常见类型与术语 图的表示 邻接矩阵 邻接表 基础操作 基于邻接矩阵的实现 基于邻接表的实现 遍历 广度优先 深度优先 图 图 是一种非线性数据结构&#xff0c;由 顶点 和 边 组成。 相较于线性关系的链表和分治关系的树&#xff0c;网络关系的图自由度更高 常见…

初探Vue前端框架

文章目录 简介什么是Vue概述优势MVVM框架 Vue的特性数据驱动视图双向数据绑定指令插件 Vue的版本版本概述新版本Vue 3Vue 3新特性UI组件库UI组件库概述常用UI组件库 安装Vue安装Vue查看Vue版本 实例利用Vue命令创建Vue项目切换工作目录安装vue-cli脚手架创建Vue项目启动Vue项目…

实战-任意文件下载

实战-任意文件下载 1、开局 开局一个弱口令&#xff0c;正常来讲我们一般是弱口令或者sql&#xff0c;或者未授权 那么这次运气比较好&#xff0c;直接弱口令进去了 直接访问看看有没有功能点&#xff0c;正常做测试我们一定要先找功能点 发现一个文件上传点&#xff0c;不…

Find My平板键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

‌平板键盘的主要用途包括提高输入效率、支持轻量化办公、提供丰富的文本编辑功能以及快捷操作。相比于直接在屏幕上打字&#xff0c;使用键盘可以显著提升输入速度&#xff0c;减少输入错误&#xff0c;特别是对于需要大量文字输入的场景&#xff0c;如写作、记录笔记等‌。平…

擎创科技声明

近日&#xff0c;我司陆续接到求职者反映&#xff0c;有自称是擎创科技招聘人员&#xff0c;冒用“上海擎创信息技术有限公司”名义&#xff0c;用“126.com”的邮箱向求职者发布招聘信息&#xff0c;要求用户下载注册APP&#xff0c;进行在线测评。 对此&#xff0c;我司郑重…

使用 Flask 实现简单的登录注册功能

目录 1. 引言 2. 环境准备 3. 数据库设置 4. Flask 应用基本配置 5. 实现用户注册 6. 实现用户登录 7. 路由配置 8. 创建前端页面 9. 结论 1. 引言 在这篇文章中&#xff0c;我们将使用 Flask 框架创建一个简单的登录和注册系统。Flask 是一个轻量级的 Python Web 框架…

web网站搭建(静态)

准备工作&#xff1a; 关闭防火墙&#xff1a; [rootlocalhost ~]# systemctl disable --now firewalld 修改enforce为permissive [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# geten getenforce getent [rootlocalhost ~]# getenforce Permissive 重启服务 [rootloca…

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM&#xff08;Basic Software Mode Manager&#xff09;模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式&#xff08;如启动、运行、停车等&#xff09;&#xff0c;并根据不同的…

网络搜索引擎Shodan(1)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shodan(1)_哔哩哔哩_bilibili 本文主要讲解网络搜索引擎Shodan的一些用法&#xff08;host和search这两个命令&#xff09;。 Shodan 是一个网络…

智创 AI 新视界 -- 探秘 AIGC 中的生成对抗网络(GAN)应用

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)

文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…