Maven高级篇

server/2024/11/24 22:00:00/

本篇主要讲解做项目过程中学习到一些关于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/server/144645.html

相关文章

JavaWeb-表单-07

表单标签 介绍 code: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML-表单</title> &…

如何能让安全责任更清晰——构建清晰安全责任体系策略与实践

安全已成为各行各业不可忽视的重要议题。然而&#xff0c;要确保组织的安全运行&#xff0c;仅仅有安全意识是不够的&#xff0c;还需要有一套清晰明确的安全责任体系来支撑。这套体系能够明确每个人的安全职责&#xff0c;促进安全管理工作的有序进行&#xff0c;降低事故发生…

Paint 学习笔记

目录 ippaint 外扩对象 LCM_inpaint_Outpaint_Comfy&#xff1a; 不支持文字引导 ippaint https://github.com/Sanster/IOPaint 外扩对象 https://www.iopaint.com/models/diffusion/powerpaint_v2 GitHub - open-mmlab/PowerPaint: [ECCV 2024] PowerPaint, a versatile …

MyBatis-数据库连接池、属性文件config.properties、类名简化、MyBatis的整体架构

一、数据库连接池 1、概述 存储实现创建好的连接对象的容器 2、优点 避免了频繁创建和销毁连接对象 3、使用 在使用到连接对象时可在数据库连接池中直接获取 4、实现 不需要我们去实现,框架和一些第三方有现成的组件&#xff08;C3P0、ADCP、德鲁伊(阿里巴巴)&#xff…

Leetcode 每日一题 11. 盛最多水的容器

目录 引言 问题背景 输入输出规范 示例解析 示例 1 示例 2 算法策略 Java代码实现 复杂度分析 结语 引言 在算法的世界里&#xff0c;有些问题虽然简单&#xff0c;但却是锻炼算法思维的绝佳练习。今天&#xff0c;我们将深入探讨一个在面试中经常出现的问题——“接…

SpringBoot中小企业人事管理系统:设计模式

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

前言 最近需要将一个服务器上的minio桶的数据迁移到新服务器上,所以学习了一下,使用的是minio client。 MinIO Client (mc) 是一个用于与 MinIO 和其他兼容 Amazon S3 的云存储服务交互的命令行工具。MinIO 是一个高性能的对象存储服务器,mc 提供了一个丰富的命令集来管理对…

Spring 中的 ProxyFactory 创建代理对象

一、jdk 动态代理 和 cglib动态代理 简单介绍 1.jdk动态代理 public interface AService {public String serviceA(String param);public String serviceAA(String param); } public interface BService {public String serviceB(String param);public String serviceBB(Str…