Maven高级篇

embedded/2024/11/28 8:09:25/

本篇主要讲解做项目过程中学习到一些关于maven使用的知识,主要包括分模块设计、继承,继承中的版本锁定,maven的聚合以及maven私服。

目录

一、分模块设计

二、继承

三、继承中的版本锁定

maven%E7%9A%84%E8%81%9A%E5%90%88-toc" style="margin-left:0px;">四、maven的聚合

maven%E7%A7%81%E6%9C%8D-toc" style="margin-left:0px;">五、maven私服


一、分模块设计

优势:模块化,方便管理、便于团队协作;模块可以被多个项目共享和重用;可以单独构建一个小模块也可以组建成一个大模块,灵活性高。

首先一个项目需要做到分模块完成,例如一个大型项目,如果工具类以及实体类等各种操作都放到了一个模块的话,这样会很难复用以及管理,所以可以分模块进行设计:例如,之前介绍做的学习系统项目可以将pojo以及utils类分离出去各成为一个模块,如果主模块想用的话,可以直接引入相应的依赖即可。(此部分演示的是将已经完成的整体项目拆分成多个模块,但是实际开发过程中直接就先分模块然后分模块再完成项目。)

最初始的结构:

首先将原来项目中pojo包复制一份然后创建一个新的maven项目(注意此处的groupid与原项目的都保持一致),此处不需要创建springboot项目,因为只是一个简单的实体类的包,然后创建一个与原项目一样的包名:

然后复制即可完成。然后utils类同样,这样就分成了三个模块:

二、继承

将项目拆分成上述三个模块后,每个模块各有一个独立的pom文件,各自配置相应的依赖,例如,三个模块都需要引入lombok依赖,如果有多种共用的依赖,都需要引入一遍,这样会非常的冗余。所以可以使用一个父模块,抽离出相同的依赖,然后让这几个模块去继承这个父模块,这样可以做到简化依赖配置,统一依赖管理。具体实现使用<parent>...<parent>

由于maven中一个模块只能继承一个模块(类似java中一个类只能有一个父类,但是父类可以有多个子类),他们继承一个springboot-starter-parent,那该如何引入这个父类呢?->可以在中间开辟一个父模块,让这个父模块再去继承springboot-starter-parent即可实现。

整体结构如下图:

整体流程如下:

先定义好一个父工程A,然后在pom文件里面设置packaging打包方式为pom,然后复制springboot项目中pom文件的父工程B,parent标签到父工程A的pom文件中,然后将springboot项目中的父工程改为B,然后将其他所有的子模块的父工程都改为B并设置relativePath标签,子工程的groupid可以删除,因为会自动继承父工程的groupid。最后将共同的依赖抽离出来,写到父工程A的pom文件中即可完成继承。

三、继承中的版本锁定

maven中可以在父工程的pom文件中通过<dependencyManagement>来统一管理依赖版本。

案例如下:

如果在一个项目中,有几个模块没有用到jwt依赖,那没必要在父工程中配置这个依赖,但是还有另一些模块用到了这个依赖,此时就需要在这些模块中一个个去配置,但是当这个依赖的版本需要更改的时候,就要一个一个模块去查看是否用了这个依赖,然后一个一个去改,当模块比较多的时候就容易遗漏掉,所以可以在父工程中设置dependencyManagement标签进行统一管理依赖版本。

注意:如果在父工程中进行了依赖版本管理,只是统一了版本,并没有直接将依赖加进去,子工程还是需要自己配置的,但是不需要version标签了。

这种方法还是有些结构上复杂,所以可以用以下方式——自定义属性:

在父类的pom文件中的properties标签中填写相应依赖的版本号。然后在父类的pom文件中的相应依赖版本处写上${}版本号即可:

小结: 

maven%E7%9A%84%E8%81%9A%E5%90%88" style="margin-left:0px;text-align:justify;">四、maven的聚合

当一个项目完成之后想要打包发送的时候,由于一个项目是由多个模块构成的,然后想打包一个模块的时候此时会报错,因为依赖的其他模块没有找到,所以需要将其所依赖的模块以及父工程要先下载(install)到maven仓库中才行,然后再打包这个模块才能完成,如果当模块比较多的时候需要一个一个模块先install然后再打包主要的模块,这种方法比较费时费力,所以引出了聚合:将多个模块组织成一个整体,同时进行项目构建。需要一个不具有业务功能的“空”工程,有且仅有一个pom文件,此时可以想到父工程,这个工程中仅仅有一个pom文件,因此父工程也叫聚合工程。

构建完成后直接在聚合工程中package即可。

小结:继承和聚合的异同点:

继承用于简化依赖配置,统一管理依赖版本;聚合用于快速构建项目。

相同点:聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中。聚合与继承均属于设计型模块,并无实际的模块内容。

不同点:聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些;继承是在子模块中配置关系,父工程无法感知哪些子模块继承了自己。

maven%E7%A7%81%E6%9C%8D" style="margin-left:0px;text-align:justify;">五、maven私服

首先有两个开发团队A和B,然后各自电脑上有自己的maven仓库,此时A将项目打包后安装在自己的maven本地仓库中,此时B也想用A中的模块jar包,如果B仅仅导入想用模块jar包的依赖这样是找不到的然后会从中央仓库去寻找,但是A没有上传到中央仓库所以B在中央仓库中也无法找到。有一个想法是A将jar包发送到中央仓库,此时B就可以找到这个jar包,但是中央仓库只有一个,普通人是无法将jar包上传到中央仓库的。所以引入了私服,相当于本地仓库和中央仓库之间加了个中间存储点。

那么如何将资源上传到私服以及如何从私服中下载资源:

首先要将上传的jar包下载到本地仓库,然后执行maven的指令deploy上传到私服,需要配置访问私服的用户名以及密码,由于私服中有多个仓库,所以要制定上传到哪一个仓库所以还需要配置一个仓库的url地址。在下载过程中,需要知道私服的地址,所以还需要配置私服仓库的地址url。

central仓库代表是从中央仓库下载的,另外两个是用户上传的。如下图:

  1. 首先要设置私服的访问用户名和密码:注意要配置两个:

2.配置上传地址:也要配置两个:

3.在mirror标签中设置下载的仓库地址,这里的url地址并不是具体哪一个仓库而是一组仓库汇聚成为的一个地址。还需要在profile标签中配置仓库组的地址,并且还需要将enabled设置为true,因为默认情况下SNAPSHOWTS的不允许下载。

以下两个id要对应起来:

然后配置完成后只需要将需要上传的模块中执行maven生命周期的deploy指令即可。

将父工程上传后其子工程也跟着上传。整体如下:


http://www.ppmy.cn/embedded/141142.html

相关文章

设计模式学习之——责任链模式

责任链模式的基本概念 定义&#xff1a;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象按照一定顺序处理请求&#xff0c;并且每个对象可以选择自己是否处理该请求或者将其传递给下一个对象处理。 核心思…

详解PyTorch中的Sequential容器:构建与优化简单卷积神经网络

详解PyTorch中的Sequential容器&#xff1a;构建与优化简单卷积神经网络 Sequential 是 PyTorch 中的一个容器模块&#xff0c;它按照在构造函数中添加它们的顺序来组织多个子模块&#xff08;通常是网络层&#xff09;。Sequential 容器允许用户快速串联多个模块&#xff0c;…

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce 我们来分析一下这个代码&#xff1a; 首先是isset看我们有没有传一个为空的值&#xff0c;如果为空就输出居然都不输入参数&#xff0c;可恶!!!!!!!!!不为空就GET传参赋值给$code &#xff0c;接着 如果 $code 中不包含这些模式中的任何一个&#x…

git merge 排除文件

方法一&#xff1a; 在Git中&#xff0c;如果你想在合并时排除特定文件&#xff0c;你可以使用.gitattributes文件来指定合并策略。你可以设置一个自定义合并策略来忽略特定文件的合并。 首先&#xff0c;在仓库的根目录下创建或编辑.gitattributes文件&#xff0c;并添加以…

MySQL底层概述—4.InnoDB数据文件

大纲 1.表空间文件结构 (1)表空间Tablesapce (2)段Segment (3)区Extend (4)页Page (5)行Row 2.Page结构 (1)页结构各部分说明 (2)页结构整体划分 3.行记录格式 (1)行格式分类 (2)COMPACT行记录格式 (3)Compact中的行溢出机制 (4)其他行格式记录 1.表空间文件结构…

设计模式:12、中介者模式

目录 0、定义 1、中介者模式的四种角色 2、中介者模式的UML类图 3、示例代码 0、定义 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变他们之间的交互。 1、中介者模式的四种角色 …

C++ 类和对象(初始化列表)

目录 一、前言 二、正文 1.初始化列表 1.1初始化的格式 1.2初始化列表的使用 1.2.1引用成员变量初始化 1.2.2const成员变量 1.2.3没有默认构造函数的成员变量必须在初始化列表初始化 2.成员变量声明处给缺省值 一、前言 前面我们已经用所学知识运算符重载写了一个日期计…

Javaweb 前端 HTML css 案例 总结

顶部导航栏 弹性布局 搜索表单区域 表单标签 表单标签&#xff0c;表单项 复选&#xff0c;一次选多个 隐藏域&#xff0c;看不到&#xff0c;但会传参数 text输入框 radio单选 男女&#xff0c;是 前端页面上显示的值 搜索表单区域 button 按钮 表格数据展示区域 fo…