Maven 高级之分模块设计与继承、聚合

在软件开发中,随着项目规模的扩大,代码量和复杂度不断增加,传统的一体化开发模式逐渐暴露出诸多问题。为了解决这些问题,模块化开发应运而生,而 Maven 正是模块化开发的利器,它提供的继承和聚合机制为构建和管理多模块项目提供了强大的支持。本文将介绍其原理与实现!

其它教程:

maven 入门详解

一、传统开发模式

未分模块示例:所有的模块都放在一个目录之下

在不使用模块化管理的项目中,所有的代码都放在同一个项目目录下,这会导致一系列问题:

  1. 编译速度慢: 即使只修改了一行代码,也需要编译整个项目,随着项目规模的增大,编译时间会越来越长,严重影响开发效率。

  2. 代码耦合度高: 不同功能模块的代码交织在一起,修改一处代码可能会影响其他模块,导致代码难以维护和调试。

  3. 项目结构混乱: 缺乏清晰的模块划分,代码文件杂乱无章,难以理解和定位问题。

  4. 团队协作困难: 多个开发者同时修改同一个项目的代码,容易发生冲突,代码合并也变得更加复杂。

  5. 代码复用性低: 不同项目中可能存在重复的代码逻辑,但由于代码耦合在一起,难以提取和复用。

二、模块化开发

模块化开发的核心思想是将一个大型项目拆分成多个独立的模块,每个模块负责特定的功能,模块之间通过接口进行交互。

分模块示例:将整体的模块进行拆分

模块化开发的优势:

  1. 提高编译速度: 每个模块可以独立编译,修改一个模块的代码只需要重新编译该模块,大大缩短编译时间。

  2. 降低代码耦合度: 模块之间通过明确定义的接口进行交互,减少了模块之间的依赖性,提高了代码的可维护性和可测试性。

  3. 清晰的项目结构: 模块化的项目结构更加清晰,易于理解和管理,方便开发者快速定位和修改代码。

  4. 提高团队协作效率: 不同团队可以负责不同的模块,并行开发,互不干扰,提高开发效率。

  5. 提高代码复用性: 独立的模块可以方便地在其他项目中复用,避免重复造轮子。

三、Maven:模块化开发的强大工具

那么我们已经把模块已经划分好了,那么这些模块直接繁琐的依赖管理如何处理呢?

这个时候,Maven 为我们提供了强大的继承和聚合机制,完美支持模块化开发。

1. Maven 继承:抽取公共配置,避免冗余
  • 概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。

  • 作用:简化依赖配置、统一管理依赖

原理: 子模块继承父模块的配置,例如依赖管理、插件配置、版本号等。这避免了在每个子模块中重复定义相同的配置,简化了 pom.xml 文件,并确保了项目配置的一致性。并且maven还支持多重继承。

示例:

示例实现:

  • 父模块 (parent-module) 的 pom.xml:

<project><groupId>com.example</groupId><artifactId>parent-module</artifactId><version>1.0.0</version><packaging>pom</packaging> <!-- 打包方式为 pom --><properties><java.version>17</java.version><spring.version>3.0.2</spring.version></properties><dependencyManagement>  <!-- 声明依赖,但不引入 --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.10.1</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></build>
</project>

  • 子模块 (user-module) 的 pom.xml:

<project><parent><groupId>com.example</groupId><artifactId>parent-module</artifactId><version>1.0.0</version><relativePath>../parent-module/pom.xml</relativePath> <!--  相对路径指向父模块的pom.xml  --></parent><artifactId>user-module</artifactId><packaging>jar</packaging> <!-- 打包方式为 jar --><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>  <!--  无需指定版本号,从父模块继承 --></dependency></dependencies>
</project>

其余子模块省略.......

2. Maven 聚合:统一构建,简化操作

那此时,大家试想一下,如果开发一个大型项目,拆分的模块很多,模块之间的依赖关系错综复杂,那此时要进行项目的打包、安装操作,是非常繁琐的。 不过通过maven的聚合就可以轻松实现项目的一键构建(清理、编译、测试、打包、安装等)。

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

  • 聚合工程:一个不具有业务功能的“空”工程(有且仅有一个pom文件) 【PS:一般来说,继承关系中的父工程与聚合关系中的聚合工程是同一个】

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

原理: 父模块将多个子模块聚合在一起,通过父模块可以一次性构建所有子模块,简化了构建过程。

实现: 在父模块的 pom.xml 文件中使用 <modules> 标签声明要聚合的子模块。

  • 父模块 (parent-module) 的 pom.xml:

<project><!-- ... (其他配置与继承示例相同) ... --><modules><module>user-module</module><module>product-module</module><module>order-module</module></modules></project>

构建过程: 在父模块目录下执行 mvn clean install 命令,Maven 会自动构建所有子模块。

依赖关系: 子模块之间可以通过声明依赖来相互引用。 例如,order-module 依赖于 user-module 和 product-module:

<project><!-- ... --><artifactId>order-module</artifactId><!-- ... --><dependencies><dependency><groupId>com.example</groupId><artifactId>user-module</artifactId><version>1.0.0</version></dependency><dependency><groupId>com.example</groupId><artifactId>product-module</artifactId><version>1.0.0</version></dependency></dependencies>
</project>

3 继承与聚合对比
  • 作用

    • 聚合用于快速构建项目

    • 继承用于简化依赖配置、统一管理依赖

  • 相同点:

    • 聚合与继承的pom.xml文件打包方式均为pom,通常将两种关系制作到同一个pom文件中

    • 聚合与继承均属于设计型模块,并无实际的模块内容

  • 不同点:

    • 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些

    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

总结:

Maven 的继承和聚合机制为模块化开发提供了强大的支持,通过合理地划分模块,并利用 Maven 的特性,可以构建出结构清晰、易于维护、扩展性强的应用程序。 理解并熟练运用 Maven 的高级特性,是每个 Java 开发者必备的技能。感谢各位看官的观看,下期见,谢谢~

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

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

相关文章

wc命令:统计文本行数、单词数、字节数

一、命令简介 ​wc​&#xff08;word count&#xff09;是一个在类 Unix 系统中常用的命令行工具&#xff0c;用于统计文本文件的 行数​、单词数 ​和 字节数​。 ​​ ‍ 二、命令参数 ​wc​ 命令的基本语法如下&#xff1a; wc [选项] 文件选项&#xff1a; ​-c​…

当管理遇上AI,工作效率翻了3倍!

最近这段时间&#xff0c;很多企业都开始降薪、裁员。 在降本增效的大背景下&#xff0c;企业但凡有什么大动作&#xff0c;压力往往都会转嫁到管理者的身上。 一方面&#xff0c;要调大家的状态&#xff0c;处理团队中的各种琐事&#xff1b;另一方面&#xff0c;要及时响应…

【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程

有关定时器外设的详细介绍在ESP-IDF的对应文章中&#xff0c;跳转栏目目录可以找到。 1. API 1.1 启动定时器 hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp); timer&#xff1a;定时器序号&#xff08;ESP32有4个硬件定时器&#xff0c;所以可填序…

SpringBoot赋能旅游管理:系统设计与实现

第三章 系统分析 3.1可行性分析 对所有的系统来说&#xff0c;都有可能会受到时间和空间上的制约。所以&#xff0c;我们在设计每一个项目的时候&#xff0c;必须对该系统实行可行性分析&#xff0c;这样不但能够降低项目的危害&#xff0c;还能改降低人力、物力和财力的损耗。…

【CKA】十六、监控Pod度量指标

16、监控Pod度量指标 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 题目意思是&#xff1a;找出label有namecpu-user的CPU最高的Pod&#xff0c;然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt文件里 3. 官网地址&#xff1a; https://kubernetes.io/zh-…

LeetCode 54 Spiral Matrix 解题思路和python代码

题目&#xff1a; Given an m x n matrix, return all elements of the matrix in spiral order. Example 1: Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: Input: matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] Output: [1,2,3,4,8,1…

反射在Go语言中的具体应用场景

在Go语言中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的特性&#xff0c;它允许程序在运行时检查、修改和操作变量的类型信息。 尽管反射在性能上通常不如直接操作&#xff0c;但它在某些特定场景下非常有用。 反射在Go语言中的具体应用场景&#xff1a;…

基于JAVA的鲜花商城管理系统(源码+定制+讲解)鲜花商城管理系统、鲜花商城管理平台、鲜花商城信息管理、鲜花商城系统开发与应用、鲜花在线商城管理系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

基于Springboot海宝海鲜餐厅系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

旅游管理智能化转型:SpringBoot系统设计与实现

第四章 系统设计 4.1系统结构设计 对于本系统的开发设计&#xff0c;先自上向下&#xff0c;将一个完整的系统分解成许多个小系统来进行实现&#xff1b;再自下向上&#xff0c;将所有的“零件”组装成一个大的、完整的系统。因此这里面的许多个小功能块都要对将要实现的功能进…

微软GraphRAG实战解析:全局理解力如何超越传统RAG

微软近日开源了新一代RAG框架GraphRAG&#xff0c;以解决当前RAG在大型语料库上全局理解问题。当前RAG主要聚焦于局部检索能力&#xff0c;即根据查询语句在向量库中匹配部分知识&#xff0c;然后通过大型语言模型合成这些检索到的信息&#xff0c;生成一个自然流畅的回答。相信…

【NLP自然语言处理】03 - 使用Anaconda创建新的环境/pycharm切换环境

NLP基础阶段&#xff1a;创建新的虚拟环境 第一步&#xff1a;查看有多少个虚拟环境 conda env list 第二步&#xff1a;创建一个新的虚拟环境&#xff0c;起个名字&#xff1a;nlpbase 打开anconda prompt终端&#xff0c;输入命令: conda create -n nlpbase python3.10 第三步…

数据仓库拉链表

数仓拉链表是数据仓库中常用的一种数据结构&#xff0c;用于记录维度表中某个属性的历史变化情况。在实际应用中&#xff0c;数仓拉链表可以帮助企业更好地进行数据分析和决策。 数仓拉链表&#xff08;Slowly Changing Dimension, SCD&#xff09;是一种用于处理维表中数据变化…

MATLAB中lsqminnorm函数用法

目录 语法 说明 示例 求解具有无限个解的线性系统 指定容差以减少含噪数据的影响 切换显示低秩矩阵警告 lsqminnorm函数的功能是线性方程的最小范数最小二乘解。 语法 X lsqminnorm(A,B) X lsqminnorm(A,B,tol) X lsqminnorm(___,rankWarn) 说明 X lsqminnorm(A,B…

[单master节点k8s部署]34.ingress 反向代理(一)

ingress是k8s中的标准API资源&#xff0c;作用是定义外部流量如何进入集群&#xff0c;并根据核心路由规则将流量转发到集群内的服务。 ingress和Istio工作栈中的virtual service都是基于service之上&#xff0c;更细致准确的一种流量规则。每一个pod对应的service是四层代理&…

YOLO11改进|卷积篇|引入线性可变形卷积LDConv

目录 一、【LDConv】卷积1.1【LDConv】卷积介绍1.2【LDConv】核心代码 二、添加【LDConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LDConv】卷积 1.1【LDConv】卷积介绍 下图是【LDCNV】的结构图&#xff0c;让我们简单分析…

JumperServer入门

一、安装部署 官方安装文档&#xff1a;快速入门 - JumpServer 文档 机器准备 CentOS7 ip 角色 192.168.252.145 主节点 192.168.252.146 被控节点1 192.168.252.148 被控节点2 安装JumperServer curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver…

集合框架03:List接口介绍及使用

1.视频链接&#xff1a;13.08 List接口使用&#xff08;1&#xff09;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?p8&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 2.代码示例 package com.yundait.Demo01;import java.util.ArrayList; import java…

Final Glory推出“荣耀勋章-神龙”,推动游戏叙事范式发展

GameFi赛道因基建设施的缺失而长期处于加密市场的边缘位置&#xff0c;该叙事在市场中的占有率正在下降。不过好的一面是&#xff0c;随着MetaArena引擎面向市场&#xff0c;正在推动区块链游戏市场的叙事向全新的范式发展。 MetaArena引擎是以零知识证明方案为基础的Web3游戏基…

实现一个计算器的功能(一般形式、函数指针数组的形式、回调函数的形式)

实现一个计算器的功能&#xff1a; 一般的形式&#xff1a; #include<stdio.h> int Add(int x, int y) {return x y; } int Sub(int x, int y) {return x - y; } int Mul(int x, int y) {return x * y; } int Div(int x, int y) {return x / y; } void menu() {printf…