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,一经查实,立即删除!

相关文章

Docker容器 || MySQL容器时间与宿主机同步

网上说的有好几种方式。 本人认为最实用的就是这个&#xff1a; docker exec -it idste_mysql ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime诸如其它的还有&#xff1a; 1、启动的时候直接挂载&#xff0c;这个有效 docker run --name your_container_name -v …

力扣第215题“数组中的第K个最大元素”

在本篇文章中&#xff0c;我们将详细解读力扣第215题“数组中的第K个最大元素”。通过学习本篇文章&#xff0c;读者将掌握如何使用快速选择算法和堆排序来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。…

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…

凸优化相关文章汇总

深度学习/机器学习入门基础数学知识整理&#xff08;三&#xff09;&#xff1a;凸优化&#xff0c;Hessian&#xff0c;牛顿法_深度学习和凸优化-CSDN博客 深度学习/机器学习入门基础数学知识整理&#xff08;四&#xff09;&#xff1a;拟牛顿法、BFGS、L-BFGS、DFP、共轭梯…

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

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

Leetcode 501:二叉搜索树中的众数

给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…

如何在服务器中安装anaconda

文章目录 Step1: 下载 Anaconda方法1&#xff1a;下载好sh文件上传到服务器安装方法2&#xff1a;在线下载 Step2: 安装AnacondaStep3: 配置环境变量Step 4: 激活AnacondaStep4: 检验安装是否成功 Step1: 下载 Anaconda 方法1&#xff1a;下载好sh文件上传到服务器安装 在浏览…

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

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

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

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

数据仓库面试题(三)

1. 简述什么是ER模型 &#xff1f; ER模型&#xff08;Entity-Relationship Model&#xff09;&#xff0c;即实体-关系模型&#xff0c;是一种用于表示实体之间关系的图形化数据库设计方法。它由Peter Chen在1976年提出&#xff0c;广泛应用于数据库设计、系统分析和软件工程…

Spring Boot应用知识梳理

一.简介 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的工具。它简化了基于 Spring 的应用程序的配置和部署过程&#xff0c;提供了一种快速、便捷的方式来构建独立的、生产级别的 Spring 应用程序。 Spring Boot 的一些主要优点包括&#xff1a; 1. 简化配置…

js实现数据去重合并

应用场景&#xff0c;一个list&#xff0c;包含已经选择的数据和未选择的数据&#xff0c;新增数据到已选择的数据中。 要考虑到二次选择的数据和已经选择的数据有重复的可能&#xff0c;所以&#xff0c;第一步先从二次选择的数据中进行去重&#xff0c;然后再将两个list进行数…

《互联网政务应用安全管理规定》自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 个指定的城市在一个平…

vue 无图片或者图片报错时显示默认图片

一个需求&#xff1a;无图片或者图片报错时显示默认图片 <template><img :src"inImgAddr" class"park-img" error"$event.target.src urlImage" /> </template> <script> import urlImage from /assets/emptyCar.png;…