Springboot多模块项目从0构建打包运行

今天复习了一下Springboot的多模块的构建,其实一直以来都对单体项目使用多模块感到不太理解,不知道到底有什么样的优势,目前切身体会到的优势就是确实可以让依赖的划分更加清晰(每个模块下的pom文件只引入该模块需要的依赖)和稳定(父项目控制子项目的依赖版本,避免依赖版本不同导致问题),其他没有太多的感受,后续遇到了再补充吧

创建项目

要创建多模块项目,首先需要创建一个maven项目作为父模块
在这里插入图片描述
既然是作为父模块,那么就不需要选任何组件,其实我后续子模块的创建也没有选定任何组件,都是按需在pom文件中手动加入的
在这里插入图片描述
创建完成后,我们删除src目录和 其他不需要的文件
在这里插入图片描述
接下来我们选定父模块,去新建entity,dao,service和web模块,流程和下图是一模一样的,需要记住的是,创建完这些模块之后,需要删除src下的启动类和不需要的文件,但是web模块下的启动类可以保留,作为项目启动的入口
在这里插入图片描述
这样都新建完成之后我们可以看下现在的全部目录(图片被吞了我没发觉,这是后续补的,这些类是后续加的,可以先不管)
在这里插入图片描述

处理pom文件

首先我们需要处理父pom文件,删除build、dependencyManagement、dependencies和properties标签,后续需要可以再加,然后在父pom中将打包类型设置为pom类型用于指示该Maven模块是一个聚合(Aggregation)或父(Parent)模块,而不是一个常规的可执行JAR、WAR或其他类型的包。
首先我们要声明有哪些子模块,所以父pom需要标明这些信息,然后我们需要声明这些子模块所使用的依赖版本,尽量统一或者兼容,这样可以在其他子模块引入依赖的时候不需要关心引入的版本了,避免不必要的问题出现导致项目起不来还需要去排查,按照以上思想我们就成功编辑了一个父模块,完整pom内容如下:

<?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><groupId>com.example</groupId><artifactId>father</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><name>father</name><modules><module>dao</module><module>entity</module><module>service</module><module>web</module></modules><properties><base.version>2.7.6</base.version><mysql.version>8.0.25</mysql.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${base.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>${base.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>${base.version}</version></dependency></dependencies></dependencyManagement></project>

处理子pom文件

父pom设置好了之后,我们处理子pom文件,首先我们设置dao层的pom文件。需要说明的是在编辑子pom之前依然需要删除生成的pom文件中的没用的东西,删除完后的pom内容如下,非常简洁:

<?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><groupId>com.example</groupId><artifactId>dao</artifactId><version>0.0.1-SNAPSHOT</version><name>dao</name>
</project>

首先需要声明父依赖,标明它是父依赖下的子模块。然后我们会想既然这是和后端数据库打交道的模块,那么就要引入使用的数据库的依赖,然后引入持久层框架的依赖,我这里使用的MySQL数据库和mybatis框架,那么就需要引入对应的依赖,然后该模块肯定还需要引入entity模块的依赖,因为我们要使用这个模块下的实体类呀,所以处理完之后的pom内容如下:

<?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><groupId>com.example</groupId><artifactId>dao</artifactId><version>0.0.1-SNAPSHOT</version><name>dao</name><!--声明父模块--><parent><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version><artifactId>father</artifactId></parent><!--需要的依赖--><dependencies><dependency><groupId>com.example</groupId><artifactId>entity</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>
</project>

同样的,service层需要依赖dao层,步骤和上面说的一样,删除不需要的东西,我们想要时可以后续再配。处理完成的pom如下:

<?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><groupId>com.example</groupId><artifactId>service</artifactId><version>0.0.1-SNAPSHOT</version><name>service</name><!--声明父模块--><parent><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version><artifactId>father</artifactId></parent><!--所需依赖--><dependencies><dependency><groupId>com.example</groupId><artifactId>dao</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies></project>

web层和上面都是一样的,其实每层都是一样的思路,你想要什么依赖自己配置,web层这里需要加入spring-web依赖并且依赖于service。需要提一嘴的时,由于项目启动类就在这里,所以最后打包也是在这里执行的,这里需要多配置下打包信息。最终pom如下:

<?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><groupId>com.example</groupId><artifactId>web</artifactId><version>0.0.1-SNAPSHOT</version><name>web</name><!--声明父模块--><parent><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version><artifactId>father</artifactId></parent><dependencies><dependency><groupId>com.example</groupId><artifactId>service</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!--打包信息--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.6</version><configuration><!--多模块下,指定统一入口文件,否则会导致打包失败--><mainClass>com.example.web.WebApplication</mainClass><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

至此,基本配置已经完成,尝试启动项目看看
在这里插入图片描述
也没问题,那我们尝试加入一个接口吧

加入接口打包运行

直接放图吧(只放了dao和controller层,其他都是按照三层架构正常写的,就不放了)
在这里插入图片描述
在这里插入图片描述

这里都是虚构的接口,我没有和真实的数据库交互,只是测试接口能否正常访问,但是由于dao层加入了MySQL的依赖,所以需要在application.yml文件中补全数据库信息,如下图:
在这里插入图片描述
需要注意在启动类上加入@ComponentScan注解扫描其他模块的bean,如果是真实的mapper接口还需要打@MapperScan注解去扫描@mapper注解的接口
打包运行
在这里插入图片描述
在这里插入图片描述
成功!

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

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

相关文章

wsl ubuntu 安装Anaconda3步骤

如何在Ubuntu上安装Anaconda3呢?本章记录整个安装过程。 1、下载脚本 https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 下载之后,将脚本上传到Ubuntu里。 2、安装脚本 bash Anaconda3-2021.11-Linux-x86_64.sh根据提示进行安装,提示输…

maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包

一 、springboot jar包 maven的pom文件 1 在resources下放了一些文件想打进去jar包 2 在lib下放了其他稀奇古怪jar包文件想打进去jar包 编写如下引入jar <build><!-- 打包名称 --><finalName>${project.artifactId}</finalName><resources><…

visual studio 2022配置和使用jsoncpp

下载 jsoncpp下载位置&#xff1a; GitHub - open-source-parsers/jsoncpp: A C library for interacting with JSON. 编译库 1、下载完成之后解压 2、在解压文件的makefiles文件下有个vs71&#xff0c;在vs71中有visual studio项目&#xff0c;不过这里的项目是visual stud…

NSI66x1B:单通道增强隔离智能栅极驱动器

Single-Channel Isolated Smart Gate Driver 单通道隔离智能门驱动器 参考 Novosense-NSi66x1A_Datasheet_Rev1.x_EN.pdf Product Overview NSI66x1B是一款单通道增强隔离智能栅极驱动器,可在许多应用中驱动igbt和SiC mosfet。它可以输出和吸收10A的峰值电流。系统鲁棒性由…

Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等

简介 TypeScript 是 JavaScript 的超集&#xff0c;是 JavaScript&#xff08;弱类型语言&#xff09; 的强类型版本。 拥有类型机制文件后缀 .tsTypescript type ES6TypeScript 和 JavaScript 的关系类似 less 和 css 的关系TypeScript对 JavaScript 添加了一些扩展&#x…

入门网络安全工程师要学习哪些内容

大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。 网络安全工程师是一个概称&#xff0c;学习的东西很多&…

《互联网政务应用安全管理规定》自2024年7月1日起,关于日志存储至少保存一年说明

学习目标&#xff1a;《互联网政务应用安全管理规定》第二十条 机关事业单位应当留存互联网政务应用相关的防火墙、主机等设备的运行日志&#xff0c;以及应用系统的访问日志、数据库的操作日志&#xff0c;留存时间不少于1年&#xff0c;并定期对日志进行备份&#xff0c;确保…

DBeaver通过jdbc方式连接ES(免证书)

前言 之前其实已经分享过DBeaver连接ES,为什么重新分享一篇,用过的肯定知道,之前那种方式需要ES服务的服务器上装证书,免费证书只能用一个月。这次分享的就是解决这个时间限制问题,但是需要用一个自己开发的jar,而且暂未上到maven的中心库。 一、先看效果 证书方式 自研…

【系统架构设计师】五、计算机网络(概念|通信技术|网络技术)

目录 一、计算机网络概念 二、通信技术 三、网络技术 3.1 局域网(LAN) 3.1.1 局域网拓扑结构 3.1.2 局域网协议 3.2 无线局域网(WLAN) 3.3 广域网(WAN) 3.4 城域网&#xff08;MAN) 3.5 移动通信网 四、组网技术 4.1 OSI七层模型 4.1.1 交换机 4.1.2 路由器 4.2…

Java面向对象特性

Java继承&#xff1a; 继承的概念&#xff1a; 在Java中&#xff0c;继承&#xff08;inheritance&#xff09;是面向对象编程的一个重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c…

算法设计与分析--近似算法作业及答案

近似算法作业题目 1 k-center 近似算法题目描述参考答案解答 题目 2 均衡负载算法题目描述参考答案解答 题目 3 多项式归约题目描述参考答案解答 近似算法–徐小华 近似算法作业 题目 1 k-center 近似算法 题目描述 问题 1&#xff1a;假设给定 n n n 个指定的城市在一个平…

大模型ReAct:思考与工具协同完成复杂任务推理

ReAct: Synergizing Reasoning and Acting in Language Models Github&#xff1a;https://github.com/ysymyth/ReAct 一、动机 人类的认知通常具备一定的自我调节&#xff08;self-regulation&#xff09;和策略制定&#xff08;strategization&#xff09;的能力&#xff0…

vue 代理

一、常用的发送一个ajax请求&#xff1a; 1、xhr new XMLHttpRequest(),真正开发中不常用 2、jq&#xff0c;jq主要功能是获取dom&#xff0c;周边才是请求接口 3、axios&#xff08;大名鼎鼎的&#xff09; axios.get("url").then(response>{},error>{} )4、…

Python应用开发——30天学习Streamlit Python包进行APP的构建(11)

st.bokeh_chart 显示互动式虚化图。 Bokeh 是 Python 的一个图表库。此函数的参数与 Bokeh 的 show 函数的参数非常接近。有关 Bokeh 的更多信息,请访问 https://bokeh.pydata.org。 要在 Streamlit 中显示 Bokeh 图表,请在调用 Bokeh 的 show 时调用 st.bokeh_chart。 Fu…

二叉树的方法

目录 一、二叉树的定义 ​编辑 二、二叉树的创建 三、二叉树的遍历 1、前序遍历 2、中序遍历 3、后序遍历 4、层序遍历 四、二叉树遍历方法的使用 五、二叉树的操作 1、节点的个数 2、叶子节点的个数 3、第k层节点的个数 4、二叉树的高度 5、检查值为value的元素…

java生成excel,uniapp微信小程序接收excel并打开

java引包&#xff0c;引的是apache.poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency> 写一个测试类&#xff0c;把excel输出到指定路径 public s…

快20倍还便宜 NVIDIA GPU的“掘墓人”出现了?

芯片初创公司Etched近日宣布推出了一款针对 Transformer架构专用的AISC芯片 “Sohu”&#xff0c;并声称其在AI大语言模型&#xff08;LLM&#xff09;推理性能方面击败了NVIDIA最新的B200 GPU&#xff0c;AI性能达到了H100的20倍。这也意味着Sohu芯片将可以大幅降低现有AI数据…

精密机器中的交叉导轨负荷与容许负荷的差异!

交叉导轨的设计和制造过程中&#xff0c;负荷及容许负荷是至关重要的参数&#xff0c;只有准确计算出交叉导轨的载荷&#xff0c;才能保证交叉导轨的稳定性和使用寿命。 负荷和容许载荷是两个不同的参数&#xff0c;那这两者的有什么差异呢&#xff1f; 交叉导轨的负荷是指其承…

微信群被恶意举报封了加新群的看这里

由于近期太忙&#xff0c;有时候手机被儿子拿玩看动漫了&#xff0c;被误删或是误踢的朋友说声抱歉。 感谢大家的理解和支持。

HarmonyOS Next开发学习手册——通过startAbilityByType拉起垂类应用

使用场景 开发者可通过特定的业务类型如导航、金融等&#xff0c;调用startAbilityByType接口拉起对应的垂域面板&#xff0c;该面板将展示目标方接入的垂域应用&#xff0c;由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用方提供统一的安全、可信的目标方应用&a…