Maven高级操作--分模块设计、聚合、继承和私服

news2024/10/6 20:32:50

一、分模块设计与开发

1.1 分模块设计

  • 问题:当项目做大做强的时候,前面的基础Spring开发的框架都无法满足java大型项目的维护和复用,而且团队合作也会造成较大的困难。
  • 所以就需要分模块设计:将项目按照功能拆分成若干个子模块,方便项目的管理维护扩展,也方便模块间的相互调用资源共享

分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。

  • 大概步骤:
  1. 创建一个新的maven项目,并填写需要分出去的模块名。
  2. 在原项目下将模块的包,如utils包下的类,放到目标maven项目下,目录名字保持一致main\java\com\mannor\utlis
  3. 将需要的依赖项导入到新maven中。
  4. 将新maven导入到原来的项目pom.xml文件中,即可食用。

二、继承与聚合

2.1 继承

  • 概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程*可以继承父工程中的配置信息,常见于依赖关系的继承**。
  • 作用:简化依赖配置、统一管理依赖
  • 实现:<parent> ... </parent>

2.1.1 继承关系的实现

  1. 创建maven模块tlias-parent,该工程为父工程,设置打包方式**pom**(默认jar)。
    <!-- 只截取了关键部分代码 -->
	<!-- 设置父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.mannor</groupId>
    <artifactId>tlias-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging> <!-- 设置打包方式 -->

</project>

  1. 子工程pom.xml文件中,配置继承关系。
    <!-- 只截取了关键部分代码 -->
  <parent>
        <groupId>com.mannor</groupId>
        <artifactId>tlias-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../tlias-parent/pom.xml</relativePath> <!-- 父工程的pom文件的相对路径 -->
    </parent>

    <artifactId>tlias-web-management</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tlias-web-management</name>
    <description>tlias-web-management</description>
  1. 父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。
  • 代码展示略。

2.1.1.1 继承关系图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6mOZ6ev-1688110403571)(24_files/1.jpg)]

2.1.1.2 重点

  1. 在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的。
  2. relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程)。
  3. 若父子工程都配置了同一个依赖的不同版本,以子工程的为准。

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

2.1.2 版本锁定

2.1.2.1 版本管理

  • 在maven中,可以在父工程的pom文件中通过<dependencyManagement>来统一管理依赖版本。
  • 子工程引入依赖时,无需指定<version>版本号,父工程统一管理。变更依赖版本,只需在父工程中统一变更。
  1. 在父工程中:
 <!--  统一管理依赖版本:只是版本的管理,不会有直接依赖 -->
    <dependencyManagement>
        <dependencies>

            <!--  jwt令牌-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.1</version>
            </dependency>
			
        </dependencies>
    </dependencyManagement>
  1. 在子工程中直接引用即可,无需指定版本号:
    <dependencies> 

        <!--  jwt令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>

    </dependencies>

2.1.2.2 自定义属性/引用属性

  • 在大型开发中,会有许多依赖需要引用,所以有自定义属性来直接管理版本信息,更方便后期的维护。
  1. 自定义属性:
    <properties>
        <lombok.version>1.18.24</lombok.version>
    </properties>
  1. 引用属性
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

思考?<dependencyManagement><dependencies>的区别是什么?
1.<dependencies>是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
2.<dependencyManagement>`是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)

2.2 聚合

  • 当项目开发完毕时,要对目标工程执行打包的操作。目标工程会在本地的maven仓库中去寻找对应依赖的jar包,不然就不会构建成功。
  • 要想将jar包放到maven的本地仓库就要按照顺序执行对应maven项目或者模块的install操作,这样才会打包成功。

当然这种方式的缺点也很明显,就是当项目模块的数量很多的时候就不便于操作了。所以就需要maven的聚合。

2.2.1 概念

2.2.1.1 聚合:

  • 将多个模块组织成一个整体,同时进行项目的构建。

2.2.1.2 聚合工程

  • 一个不具有业务功能的“空”工程(有且仅有一个pom文件)---->parent父工程就刚好可以充当这样得到角色。

2.2.1.3. 作用

  • 快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)

2.2.2 操作实现

  • maven中可以通过<modules>设置当前聚合工程所包含的子模块名称

聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。

  • 源码实现,在父工程的pom.xml文件下:
    <!--  聚合其他模块  -->
    <modules>
        <module>../tlias-pojo</module>   <!-- 在里面填写需要聚合模块的相对路径 -->
        <module>../tlias-utlis</module>
        <module>../tlias-web-management</module>
    </modules>
  • 最后操作:执行父工程的install或clean等指令和程序。

2.3 继承与聚合的区别

2.3.1 作用

  • 聚合用于快速构建项目
  • 继承用于简化依赖配置、统一管理依赖

2.3.2 相同点:

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

2.3.3 不同点:

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

三、maven的私服

1.介绍

  • 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。
  • 依赖查找顺序:–>本地仓库–>私服–>中央仓库

私服在企业项目开发中,一个项目/公司,只需要一台即可(无需我们自己搭建,会使用即可)。

2.资源的上传和下载

  • 项目版本:
    • RELEASE(发行版本)︰功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
    • SNAPSHOT(快照版本)︰功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库

3.具体操作

  1. 设置私服的访问用户名/密码(settings.xml中的servers中配置)。
  2. IDEA的maven工程的pom文件中配置上传(发布)地址。
  3. 设置私服依赖下载的仓库组地址(settings.xml中的mirrors、profiles中配置。

因为私服的信息配置都是固定的步骤,所以我将私服的配置操作在此省略,单独写成md文件,需要的可以私我发你。

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

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

相关文章

JDK8新特性-下部

文章目录 一、Stream结果收集1.1 结果收集到集合中1.2 结果集收集到数组中1.3 对流中数据做聚合运算1.4 对流中数据做分组操作1.5 对流中的数据做分区操作1.6 对流中的数据做拼接 二、并行的Stream流2.1 串行的Stream流2.2 并行流2.2.1获取并行流2.2.2 并行流操作 2.3 串行流与…

深入探究小程序技术:构建轻巧高效的移动应用

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 1.背景&#xff1a;2. …

SwiftUI async/await 并发代码提示 Non-sendable type cannot cross actor boundary 警告的解决

问题现象 从 Swift 5.5 开始, 为我们引入了新的 async/await 并发模型,使用它我们可以用更简洁的代码来实现复杂的并发功能。 async/await 并发模型同时也对大部分系统框架中的类型做了扩展,让它们在并发上重新“焕发青春”。 不过,我们在用新并发模型撸码的过程中,有…

深度学习训练营之中文文本分类识别

深度学习训练营之中文文本分类识别 原文链接环境介绍前置工作设置环境设置GPU加载数据 构建词典生成数据批次和迭代器模型定义定义实例 定义训练函数和评估函数模型训练模型预测 原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366;…

SpringBoot(实用开发篇)

SpringBoot实用开发篇 第三方属性bean绑定 ConfigurationProperties 使用ConfigurationProperties为第三方bean绑定属性 配置文件 datasource:driverClassName: com.mysql.jdbc.Driver servers:ipAddress: 192.168.0.1port: 80timeout: -1ServerConfig类&#xff1a; Dat…

PIC16F877A Proteus仿真太阳能市电互补供电系统蓄电池充电 -0051

PIC16F877A Proteus仿真太阳能市电互补供电系统蓄电池充电 -0051 Proteus仿真小实验&#xff1a; PIC16F877A Proteus仿真太阳能市电互补供电系统蓄电池充电 -0051 功能&#xff1a; 硬件组成&#xff1a;PIC16F877A单片机 LCD1602显示器AC220V市电转59V直流蓄电池充电电路…

机器学习讲了什么?如果你看不懂南瓜书和花书,先看看这本机器学习图解书

优达学城创始人Sebastian Thrun作序推荐&#xff0c; 机器学习布道者、Google和Apple前工程师Luis G. Serrano 倾情分享&#xff1a; 以图形的方式讲解机器学习经典算法和技术。 近年来&#xff0c;“人工智能”“机器学习”和“深度学习”蓬勃发展&#xff0c;各种新的技术和…

9-1小波变换 小波分解和重构(matlab程序)

1.简述 一、小波处理信号的一般过程 1&#xff09;取样&#xff1a;这是一个预处理步骤。若信号连续&#xff0c;那么必须以能够捕获原信号必要细节的速率取样。不同的应用决定了不同的取样率。如&#xff1a;原信号的细节频率为20kHz&#xff0c;由Nyquist采样定理&#xff0c…

剑指 Offer !37. 序列化二叉树

剑指 Offer 37. 序列化二叉树 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑&#xff0c;你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序…

Day43

思维导图 深拷贝和浅拷贝 1> 如果类中有指针成员时&#xff0c;如果没有显性的定义拷贝构造和拷贝赋值函数&#xff0c;系统默认提供的都只能实现浅拷贝&#xff0c;需要显性定义出深拷贝函数&#xff0c;为了完成指针成员的独立赋值&#xff0c;如果类中没有指针成员&#…

java面向对象之java继承

文章目录 一、java继承总结 一、java继承 继承的概念 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类…

Java之集合Collection

Collection接口有两个子接口&#xff1a;List(链表|线性表)和Set(集) ---|Collection: 单列集合---|List: 有存储顺序, 可重复---|ArrayList: 数组实现, 查找快, 增删慢由于是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以…

less和sass

less和sass 相比于css解决了什么问题&#xff1f; 答案&#xff1a;less和sass可以嵌套&#xff0c;可以使用变量&#xff1b;而css不可以 BEM/CSS modules/Atomic CSS/CSS in JS&#xff0c;这些方案应用于工程化中&#xff0c;解决了的问题是&#xff1a; 多人协同/大规模场…

Leonard ai 画明代皇帝肖像

链接&#xff1a; https://app.leonardo.ai/ai-generations prompt&#xff1a; Highly detailed doodle illustration of a Chinese emperor centered, isometric, mural, doodle, composition, shape, pattern, vector art ready to print Negative Prompt&#xff1a; …

mysql 触发器

触发器&#xff1a;当对某张表进行 INSERT、DELETE、UPDATE 操作时&#xff0c;会自动触发定义的触发器中的操作。顾名思义&#xff0c;当我们为某张表定义触发器后&#xff0c;向表中添加、删除、修改数据时&#xff0c;会触发触发器中定义的操作&#xff0c;触发器像是一个事…

Python语言中while循环的应用举例

Python语言中while循环的应用举例 while循环语句是Python语言中除了for循环外另一种循环结构&#xff0c;是需要掌握的两大循环语句之一。本文将基于例子讲解Python语言中while循环的应用&#xff0c;并用两个例子说明其应用。 一、while循环语句的含义 while语句用于在满足…

vue3学习之路

Vue3简介 面临的问题&#xff1a;随着功能的增长&#xff0c;复杂组件的代码变得难以维护&#xff0c;Vue3 就随之而来&#xff0c;TypeScript 使用的越来越多&#xff0c;Vue3就是 TS 写的所以能够更好的支持 TypeScript 在这里介绍就这么简单 vue2 的绝大多数的特性 在 Vu…

12.通用定时器基本原理

1.通用定时器概述&#xff1a; &#xff08;1&#xff09;STM32定时器 STM32F10x系列总共最多有8个定时器&#xff1a; &#xff08;2&#xff09;三种STM32定时器区别&#xff1a; &#xff08;3&#xff09;通用定时器功能特点描述&#xff1a; STM32的通用TIMx(TIM2、TIM…

快速点特征直方图(FPFH)描述子提取

快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;介绍 快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;是一种基于点的描述子&#xff0c;用于描述点云数据中的局部几何信息。FPFH描述子是在…

Scrapy框架之认识MongoDB

目录 MongoDB 简介 特点 MongoDB的适用场景 MongoDB的行业具体应用 如何抉择是否使用MongoDB MongoDB 简介 MongoDB 是免费开源的跨平台 NoSQL 数据库&#xff0c;命名源于英文单词 humongous&#xff0c;意思是「巨大无比」&#xff0c;可见开发组对 MongoDB 的定位。…