Springboot+Maven多模块项目开发

Springboot+Maven多模块项目开发

  • 前言
  • 示例项目建设
    • Parent项目
    • Common模块
    • ModuleOne模块
    • 特别说明
  • 参考:


前言

1.多模块项目的好处:

  • 代码复用

一个后端项目的entity、dao、service代码需要用到前端服务,还需要用到后台管理,通过多模块可实现复用

  • 减少build时间

只需要build改动到的模块

  • 模块化代码不容易造成版本冲突

2.示例结构:

继承
聚合
继承
聚合
聚合
继承
依赖
依赖
«pom»
Parent
«需要单独运行的jar»
ModuleOne
«公共部分功能且无需单独运行的jar»
Common
«需要单独运行的jar»
ModuleTwo
  • Parent:

pom项目
作用:1.聚合子模块,自动管理子模块打包顺序等;2.进行总的依赖库版本管理
特别:不需要单独运行,没有启动类

  • Common:

公共部分功能且无需单独运行的jar模块
作用:提取出的公共功能模块,被其他子模块依赖使用
特别:不需要单独运行,没有启动类

  • ModuleOne:

业务功能需要单独运行的jar模块
作用:某一业务的运行模块,比如前端API服务
特别:需要单独运行,有启动类

  • ModuleTwo:

业务功能需要单独运行的jar模块
作用:某一业务的运行模块,比如后端管理系统
特别:需要单独运行,有启动类

示例项目建设

示例代码仓库:https://gitee.com/x-shungeer/hello-cloud/tree/master/00%20mutil-module-demo

Parent项目

利用Spring Initializr建立基于Maven的项目
Parent项目能够聚合子模块,聚合后能够批处理所有子模块,比如:
ModuleOne模块依赖Common模块,Maven打包ModuleOne时,需要先install模块Common,否则就会报错,当ModuleOne模块依赖的模块很多时,此步骤就显得耗时耗力了。使用Parent项目能够自动处理这个问题。

Spring Initializr脚手架URL:

1.https://start.spring.io
2.httpw://start.aliyun.com

针对Parent项目的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 指定该项目打包类型。pom 表示这是一个父项目(也称为聚合项目),它通常不包含可执行的代码,而是用于管理和组织多个子模块 --><packaging>pom</packaging><parent><!-- 源头是spring-boot-dependencies,定义了当前SpringBoot版本能用到的所有依赖及其适配的版本号 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><!-- 指定父模块pom.xml相对位置,若父模块pom.xml与子模块文件夹属于同一目录,则不用指定该值 --><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study.hello</groupId><artifactId>mutil-module-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>00 mutil-module-demo</name><description>00 mutil-module-demo</description><!-- 父模块的properties也是向下继承的 --><properties><java.version>11</java.version><project.encode>UTF-8</project.encode><project.build.sourceEncoding>${project.encode}</project.build.sourceEncoding><project.reporting.outputEncoding>${project.encode}</project.reporting.outputEncoding></properties><!-- 父模块依赖,被所有子模块共用的 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 依赖版本管理,管理子模块对应依赖的版本 --><dependencyManagement><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency></dependencies></dependencyManagement><!-- 只有声明在父模块pom.xml文件的modules中的子模块,才会被构建 --><modules><module>module-common</module><module>module-one</module><module>module-two</module></modules>
</project>

Common模块

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.study.hello</groupId><artifactId>mutil-module-demo</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.study.hello</groupId><artifactId>module-common</artifactId><!-- 子模块可以不声明version,这样该模块直接继承父模块版本号,其余子模块同理 --><version>0.0.1-SNAPSHOT</version><name>module-common</name><description>module-common</description><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>

ModuleOne模块

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.study.hello</groupId><artifactId>mutil-module-demo</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.study.hello</groupId><artifactId>module-one</artifactId><!-- 子模块可以不声明version,这样该模块直接继承父模块版本号,其余子模块同理 --><version>0.0.1-SNAPSHOT</version><name>module-one</name><description>module-one</description><dependencies><dependency><groupId>com.study.hello</groupId><artifactId>module-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- 由于在父模块dependencyManagement中声明了这个依赖的版本,因此子模块引入这个依赖不需要声明版本号,构建引入时会自动向上查找父模块dependencyManagement中对应依赖的版本 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><!--注意:这个地方的junit是没有版本号的,maven会自动的向上找,找到<dependencyManagerment>标签并使用它里面声明的依赖的版本号--><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 指定打包时 jar的输出位置 --><!-- <outputDirectory>../target</outputDirectory> --><!--<mainClass>com.study.hello.ModuleCommonApplication</mainClass>--><!--<classifier>exec</classifier>--></configuration><executions><execution><goals><!-- 可以把依赖的包都打包到生成的jar包中 --><!-- <goal>repackage</goal> --></goals></execution></executions></plugin></plugins></build></project>

特别说明

1.Parent项目继承自spring-boot-starter-parent,源头是spring-boot-dependencies,定义了当前SpringBoot版本能用到的所有依赖及其适配的版本号。此处也可以不继承spring-boot-starter-parent,而是在标签<dependencyManagement>内定义子模块用到的所有Springboot的依赖版本,如下述代码所示。


2.<relativePath/>标签可以指定父模块pom.xml文件所在的相对路径。基准目录是:子模块文件夹与父模块的pom.xml所在的同一目录,此时可以不指定标签的值,其他情况下需要根据此基准目录指定相对目录。例如父模块的pom.xml文件位于子模块文件夹的上两级目录,此时的标签值为:../../pom.xml


3.<modules><parent>两个标签的组合拳:<parent>标签声明继承,主要继承属性、依赖等等父模块的属性,而父模块中的<modules>是指定哪些子模块会随着该父模块一起被构建。所以,如果在项目中存在用于测试的子模块需要继承父模块,但是又不希望这些模块最后被构建,就可以在父模块中的<modules>删除这些子模块的声明。


4.<dependencies>管理所有子模块的共用依赖,也可以在此指定当前模块的依赖包,父模块<dependencies>所定义的依赖包都会被子模块所继承。


5.<dependencyManagement>管理子模块不共用的依赖库版本。这样的好处是:当模块增多时,不用一个个去修改一些不共用的依赖库版本,在<dependencyManagement>中修改即可。当父模块的pom.xml定义好<dependencyManagement>依赖库版本后,子模块在<dependencies>中直接指定依赖库名字,而不用指定版本,Maven会自动去父模块的<dependencyManagement>中定位。当然,所某个子模块不想使用父模块<dependencyManagement>指定的依赖库版本,子模块可以在<dependencies>中指定自己的版本。


6.Common模块不指定<build>标签,否则ModuleA模块和ModuleB模块build时会提示错误:Unable to find main class。这是因为spring-boot-maven-plugin打成的jar包可以运行,但是不能被其他工程依赖。此外Common模块不指定@SpringBootTest,否则会提示错误:java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

<dependencyManagement>内定义子模块用到的所有Springboot的依赖版本的代码:

    <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.6.RELEASE</version><!--<type>pom</type>配合<scope>import</scope>标签可以额外引入其他的pom文件中的<dependencyManagement>内容,解决了maven单继承的问题。--><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

参考:

1、https://blog.csdn.net/m0_71777195/article/details/131592022
2、https://blog.csdn.net/qq_40925189/article/details/103842208

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

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

相关文章

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…

Java台球厅助教教练预约上门到店系统源码

&#x1f3b1;一杆在手&#xff0c;天下我有&#xff01;台球助教教练预约系统&#xff0c;让球技飙升不是梦&#x1f680; &#x1f3af;【开篇&#xff1a;台球爱好者的福音来啦&#xff01;】&#x1f3af; 还在为找不到合适的台球教练而烦恼吗&#xff1f;或是想要在家就…

Django Nginx + uWSGI 安装配置

Django Nginx + uWSGI 安装配置 本文将详细介绍如何在Linux服务器上安装和配置Django、Nginx和uWSGI。这些技术通常一起使用来部署高性能的Django应用程序。我们将分步骤进行,确保您能够顺利地完成整个过程。 1. 安装Python和pip 在开始之前,请确保您的系统上安装了Python…

【C#学习笔记】数组

在C#中&#xff0c;数组是一种数据结构&#xff0c;用于存储一系列相同类型的元素。数组在C#中非常常见&#xff0c;因为它们提供了高效的数据存储和访问方式。下面&#xff0c;我将从基础概念到高级用法&#xff0c;为您详细解释C#中的数组。 基础概念 定义&#xff1a; 数组…

抽象代数精解【4】

文章目录 子群难点与例子中心化子与正规化子定义性质与正规化子的关系应用 det概述两个矩阵乘积的行列式等于这两个矩阵行列式的乘积 参考文献 子群 难点与例子 在 z 10 中&#xff0c;令 H { 2 ˉ , 4 ˉ , 6 ˉ , 8 ˉ } , 证明&#xff1a; H 中关于剩余类的乘法构成群&am…

社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍

系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料&#xff0c;加入兴趣围子&#xff0c;通过文字、图片、语音、视频等多种方式进行交流&#xff0c;满足用户在不同场景下的社交需求 核心功能 -&#xff0c;…

【C#学习笔记】变量、变量类型

在C#中&#xff0c;变量是存储数据的容器&#xff0c;每个变量都有其特定的数据类型&#xff0c;这决定了变量可以存储的数据类型和大小。以下是关于C#中变量的由浅入深的详细解释&#xff0c;并附带代码示例和解释&#xff1a; 基础概念 定义&#xff1a; 变量是存储数据的容…

使用 abap2xlsx 给SMW0上传的模版填充值

入参 IS_DATA OBJ_ID CHAR SAP WWW 网关对象名 DEFAULT_FILE_NAME STRING Default Extension DEFAULT_EXTENSION STRING Default File Name FILE_FILTER STRING FILENAME STRING 下载文件地址 IT_CELL ROW INT4 行号 COLUMN INT4 列号 VALUE STRING 单…

Matlab编程资源库(1)选择结构

一、if语句 在 MATLAB 中&#xff0c; if 语句有 3 种格式。 (1) 单分支 if 语句&#xff1a; if 条件 语句组 end 当条件成立时&#xff0c;则执行语句组&#xff0c;执行完之后&#xff0c; 继续执行 if 语句的后继语句&#xff0c;若条件不成 立&#xff0c;则直接执…

金融无风险套利:逆回购

金融创新与逆回购 在当今金融创新不断涌现的时代&#xff0c;逆回购作为一种无风险套利工具&#xff0c;逐渐走进了大众的视野。它不仅为投资者提供了一种新的理财方式&#xff0c;也为金融专业人士提供了一个研究和应用的新领域。本文将带领读者深入了解逆回购的基本概念、操…

人生低谷来撸C#--015 C# 属性(Property)

1、概念 在C#中&#xff0c;属性&#xff08;Property&#xff09;是一种特殊的成员&#xff0c;它提供了一种灵活的机制来访问和修改对象的状态&#xff08;即类的字段&#xff09;。属性结合了字段和方法的特性&#xff0c;使得数据的访问和修改更加安全和便捷。下面我用一个…

Qt源码交叉编译带openssl的Qt版本

一.背景 近期项目由于对接的后台服务是https的&#xff0c;之前交叉编译的Qt是不带openssl的&#xff0c;为了能支持https&#xff0c;必须要重新编译Qt。 二.环境 环境准备&#xff1a; Ubuntu版本 &#xff1a;18.04&#xff1b; openssl 版本&#xff1a;1.1.1.g&#xff1b…

C/C++的堆栈内存分配详解

在C/C编程中&#xff0c;内存管理是至关重要的一个方面。理解内存的分配方式有助于编写高效、可靠的程序&#xff0c;C/C主要使用两种内存分配方式&#xff1a;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;。这两者在管理方式、性能和使用场景上都有显著区…

python计算PMF、PDF、CDF、PPF、KDE介绍

目录 1. 总括1.1 绘图示例1.2 概念介绍1. PMF (Probability Mass Function)2. PDF (Probability Density Function)3. CDF (Cumulative Distribution Function)4. PPF (Percent Point Function)5. KDE (Kernel Density Estimation)1. 总括 1.1 绘图示例 上图展示了PMF、PDF、C…

物联网精密空调监控指标解读:松越_TCP7022EX_精密空调

监控易是一款专业的IT和物联网设备监控软件&#xff0c;能够实时监控各类IT资源和物联网设备的运行状态&#xff0c;确保系统的稳定运行。在物联网精密空调领域&#xff0c;监控易对松越_TCP7022EX_精密空调进行了全面的监控&#xff0c;以下是对其监控指标的详细解读。 监控指…

天工Godwork AT 5.2.6 GodWork2D 2.1.5 GodWork EOS 2.1实景三维建模软件

天工Godwork AT 5.2.6/GodWork2D 2.1.5/GodWork EOS 2.1实景三维建模软件 获取安装包联系邮箱:2895356150qq.com 本介绍用于学习使用&#xff0c;如有侵权请您联系删除&#xff01; 1.自主研发的平差技术&#xff0c;平差模块不依赖PATB、Bingo等国外技术 2.采用特征匹配&…

华媒舍:6个媒体宣发套餐,快速突破传播界限

在当今信息爆炸的社会中&#xff0c;有效地传播自己的信息变得愈发困难。特别是对于媒体宣发来说&#xff0c;如何在市场竞争激烈的情况下突破传播界限&#xff0c;让自己的消息传达给更多的人&#xff0c;这是每个企业和个人都面临的难题。 为了解决这个问题&#xff0c;我们推…

无人机之在农业上的用途

随着无人机技术的发展&#xff0c;农业现代化也迎来了崭新局面&#xff0c;田间随处可见无人机矫健的身影。当农业遇上科技&#xff0c;变革正悄然进行。农业无人机主要应用于农业、种植业、林业等行业。在使用过程中&#xff0c;其功能和作用并不单一&#xff0c;一般用于种植…

libtins初探-抓包嗅探

libtin 一、概述1. 可移植性2. 特性 二、基础知识1. PDU2. 地址类3. 地址范围类4. 网络接口5. 写pcap文件 三、嗅探1.嗅探基础2. 嗅探器配置3. 循环嗅探4. 使用迭代器嗅探6. 包对象7. 读取pcap文件8. 包的解析 四、发送包1. 发送网络层pdu2. 发送链路层pdu3. 发送和接收响应校验…

力扣1089复写0

1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 我们的思路是利用类似双指针的方式去解答&#xff0c;来看下代码 class Solution { public:void duplicateZeros(vector<int>& arr){int cur 0, dest -1, n arr.size();while (cur < n){if (arr[cur])d…