SpringBoot 简单多模块构建

news2024/9/23 12:39:45

前言
SpringBoot系列到现在虽然代码不多,但是感觉结构很乱,随着项目的复杂性提高,代码会越来越臃肿,耦合性高。

所以SpringBoot多模块很有必要,简单来说就是由以前按包分模块变为jar包分模块。在多模块jar模式下可以将某个jar拿出来对外共用,能大大提高代码复用率与开发效率。(后续SpringCloud就是将jar升级成war或者多个集合jar,也就是常说的微服务。)

一、模块划分
1.整体流程

(1)新建springboot项目;
(2)在新建后的springboot项目中新建多个module;
(3)修改pom文件以及删除多余的文件及文件夹;
(4)将原项目的代码放进去;

2. 新建springboot项目
通过Spring Initializr新建一个普通的spring boot项目(快速搭建springboot项目)

在这里插入图片描述
3. 新建Module
右击项目,选择新建Module

在这里插入图片描述 

 

新建springboot-common、springboot-dao、springboot-service、springboot-api模块(每个子模块的groupId要建议一样)

在这里插入图片描述

 

全部建好之后,效果如下:

4. 删除多余的文件
1.springboot项目
父模块springboot-parent中将src文件和多余的文件删除;

 

2.module模块
将springboot-service和springboot-dao下面的application启动类和对应配置文件application.yml,一起删除了,springboot-api模块的不动。

4. 修改pom文件
1.修改父模块pom.xml:将打包方式改为pom、新建modules标签
父模块pom.xm用于加载一些全局的或者公共的jar包,以及配置打包。

<?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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.local.springboot</groupId>
    <artifactId>springboot-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-parent</name>
    <description>Demo project for Spring Boot</description>

    <!--打包方式改为pom-->
    <packaging>pom</packaging>

    <!--子模块信息-->
    <modules>
        <module>springboot-common</module>
        <module>springboot-dao</module>
        <module>springboot-service</module>
        <module>springboot-api</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!--子模块继承父模块依赖-->
    <dependencies>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

</project>


2.修改api模块中的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>
    <groupId>com.local.springboot</groupId>
    <artifactId>springboot-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-api</name>
    <description>Demo project for Spring Boot</description>

    <!--继承信息-->
    <parent>
        <groupId>com.local.springboot</groupId>
        <artifactId>springboot-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!--依赖其他子模块-->
        <dependency>
            <groupId>com.local.springboot</groupId>
            <artifactId>springboot-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--spring boot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring boot test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Swagger UI API接口-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- swagger-bootstrap-ui-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


其他模块都继承父模块,这里需要注意:由于我们把其他模块的启动类删了,父模块的spring-boot-maven-plugin插件也需要删掉,然后添加到需要的模块中去,因为springboot这个插件必须要启动类,否则则会出现错误:

Failed to execute goal org.springframework.boot:
spring-boot-maven-plugin:2.5.5:repackage (repackage) on project springboot-common: 
Execution repackage of goal org.springframework.boot:spring-boot-maven-
plugin:2.5.5:repackage failed: Unable to find main class



3.其他模块修改类似,springboot-dao模块存放数据库相关处理逻辑,需要加入mybatis依赖
springboot-dao模块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>
    <groupId>com.local.springboot</groupId>
    <artifactId>springboot-dao</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-dao</name>
    <description>Demo project for Spring Boot</description>

    <!--继承信息-->
    <parent>
        <groupId>com.local.springboot</groupId>
        <artifactId>springboot-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!--依赖其他子模块-->
        <dependency>
            <groupId>com.local.springboot</groupId>
            <artifactId>springboot-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--添加MyBatis-Plus依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>


5. 修改application.yml

所有的xml配置和yml配置只能放在最外层的模块,application.yml只能放在springboot-api模块下

将以前的代码修改

#内置Tomcat容器配置
server:
  port: 8080
  servlet:
    #应用路径,配置应用路径,可方便进行反向代理
    context-path:
spring:
  # 数据源
  datasource:
    url: jdbc:mysql://localhost:3306/local_develop?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  #profiles:
    #active: @spring.profiles.active@
  #i18n国际化路径
#  messages:
#    basename: i18n/messages
  # 邮件
  mail:
    default-encoding: utf-8
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    #发送方邮件名
    username: 158111920@qq.com
    #授权码
    password: btdbkkdkrnxqbijh
    # thymeleaf模板格式
    thymeleaf:
      cache: false
      encoding: UTF-8
      mode: HTML
      servlet:
        content-type: text/html
      prefix: classpath:/templates/
      suffix: .html
  # aop
  aop:
    auto: true
    proxy-target-class: true
#日志
logging:
  config: classpath:logback-spring.xml
#mybatis-plus
mybatis-plus:
  global-config:
    db-config:
      #主键策略
      id-type: auto
      field-strategy: not_empty
      #驼峰下划线转换
      column-underline: true
      #逻辑删除配置
      logic-delete-value: 0
      logic-not-delete-value: 1
      db-type: mysql
      #声明全局默认类名的对应的表的前缀
      table-prefix: t_
    refresh: false
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    #打印出sql语句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# # mapper-locations: classpath*:com/local/springboot/springbootdao/mapper/**/*Mapper.xml
#  mapper-locations: classpath*:com/local/springboot/springbootdao/mapper/**/*Mapper.xml


SpringbootApiApplication.java启动类修改

package com.local.springboot.springbootapi;

import org.mapstruct.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

//@ServletComponentScan
@EnableSwagger2
@SpringBootApplication(scanBasePackages = "com.local.springboot")
@MapperScan(basePackages = "com.local.springboot.*.mapper")
public class SpringbootApiApplication {

    public static void main(String[] args) {
        try {
            SpringApplication.run(SpringbootApiApplication.class, args);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}


6. 代码搬家
将以前的代码搬运过来(不完整),大致结构如下:

在这里插入图片描述
二、测试

 

启动程序,浏览器输入http://localhost:8080/user/list?pageNumber=1&pageSize=10

在这里插入图片描述

在这里插入图片描述

 

SpringBoot-简单多模块构建就到这里,还有很多没完善的地方,以后慢慢完善。
————————————————
版权声明:本文为CSDN博主「.猫的树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34383510/article/details/120790064

 

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

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

相关文章

【勝讯云 Finops Crane 集训营】之集群优化实战

重要通知 由腾讯云联合 CSDN 推出的“腾讯云 Finops Crane 开发者集训营”活动&#xff0c;主要面向广大开发者&#xff0c;旨在通过线上直播、组织动手实验、有奖征文&#xff0c;开源项目贡献者招募这一系列技术实践活动中既能通过活动对 Finops Crane 开源项目有一个深入的]…

mathtype不激活能用吗 mathtype产品密钥如何取得

在文档中输入数学式子时一般会用到mathtype&#xff0c;虽然mathtype为广大用户提供了一定期限的试用期&#xff0c;但试用期后如果没有成为正式用户&#xff0c;那么部分功能可能就用不了了。有些小伙伴可能会对mathtype不激活能用吗&#xff0c;mathtype产品密钥如何取得这两…

PostGIS五分钟入门【空间数据库】

在本文中&#xff0c;我们将介绍 PostGIS 的一些基础知识及其功能&#xff0c;以及一些可用于简化解决方案或提高性能的提示和技巧。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 简而言之 - PostGIS 是一个 Postgres 扩展&#xff0c;增加了对存储和操作空间数据类…

PyQt5桌面应用开发(11):摸鱼也要讲基本法之桌面精灵

本文目录 PyQt5桌面应用系列鼠标不要钱&#xff0c;手腕还不要钱吗&#xff1f;PyQt5源程序python文件资源定义界面定义文件 技术要素资源文件StyleSheetsQMainWindow设置窗体几何 结论 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQ…

orbslam3 编译时 Thirdparty sophus 库多种错误 redefinition, not declared in this scope

问题 在装了 ROS 的机器人系统里编译 orbslam3 时, 发现 Thirdparty sophus 库密集报错, 导致 orbslam3 无法完成编译 排查 同样的代码在装了 ROS 的笔记本 ubuntu18.04 系统里可以成功通过编译, 但是在装了同版本 ROS 的机器人 ubuntu18.04 系统里无法编译 Sophus 库本身…

探秘力扣之谜:如何轻松解决最长公共前缀问题?

本篇博客我会讲解力扣中的“14. 最长公共前缀”这道题&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是几个输出示例&#xff1a; 提示&#xff1a; 这道题的思路其实并不难&#xff0c;也是一些字符串的常规操作的结合。大家可以先思考一下&#xff0c;再来听我讲…

TCP和UDP数据报文详解(区别及三次握手四次挥手详解)

总结TCP和UDP详解在后文 相同点&#xff1a; 1.都是传输层协议 2.都是全双工通信 区别&#xff1a; TCPUDP面向连接无连接一对一一对一&#xff0c;一对多&#xff0c;多对多&#xff0c;多对一(单播&#xff0c;多播&#xff0c;广播)可靠不保证可靠交付面向字节流面向报…

java变量与方法

方法 构造方法 定义&#xff1a;构造方法是一个特殊的成员方法&#xff0c;名字必须与类相同&#xff0c;在创建对象时由编译器自动调用&#xff0c;并且在生命周期内只调用一次 演示&#xff1a; 特性&#xff1a; 1.构造方法名字必须与类名相同&#xff08;如果不同&#…

Ajax XML

文章目录 AJAX XML 实例AJAX XML 实例实例解析 loadXMLDoc() 函数AJAX 服务器页面 AJAX XML 实例 AJAX 可用来与 XML 文件进行交互式通信。 AJAX XML 实例 下面的例子将演示网页如何使用 AJAX 来读取来自 XML 文件的信息&#xff1a; 代码部分 <!DOCTYPE html> <h…

Oracle—数据恢复

文档结构 1、恢复原理1.1、recyclebin&#xff08;回收站&#xff09;相关操作 2、恢复场景2.1、定义删除2.2、记录删除2.2.1、undo恢复2.2.2、redo恢复2.2.3、dbms_logmnr 场景&#xff1a;在 Oracle数据库使用过程中&#xff0c;误删对象或误删记录的情况时有发生&#xff1b…

07- 算法解读 Faster_R-CNN (目标检测)

要点&#xff1a; Faster_R-CNN RPN Fast R-CNN GitHub地址&#xff1a;vision/torchvision/models/detection at main pytorch/vision GitHub 三 Faster_R-CNN Faster R-CNN 是作者 Ross Girshick 继 Fast R-CNN 后的又一力作。同样使用 VGG16 作为网络的 backbone &am…

Windows 10 安装安卓子系统 WSA(Magisk/KernelSU)使用 WSA 工具箱安装 APK

from https://blog.zhjh.top/archives/XokySA7Rc1pkVvnxAEP5E 前提是系统为 Windows 10 22H2 10.0.19045.2311 或更高版本&#xff0c;尽量新。 步骤 使用 WSAPatch 和 MagiskOnWSALocal 安装 WSA 在 Microsoft Store 中安装 Ubuntu LTS&#xff08;或你喜欢的发行版&#xf…

Linux的进程

目录 一、进程占用的内存资源 二、进程的系统环境 三、进程一直在切换 四、父进程和子进程 五、进程状态 六、查看进程 1.ps -ef 列出所有进程 2.ps -lax 列出所有进程 3.ps aux列出所有进程 4.树形列出所有进程 七、作业&#xff08;用来查看管理进程&#xff09; …

windows环境安装运行kafka

一、配置java环境变量 1、下载安装包 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2、添加系统变量&#xff1a;JAVA_HOMED:\Program Files (x86)\Java\jdk1.8.0_144 二、安装zooKeeper 1、 下载安装包 http://zookeeper.apache.…

【Java笔试强训 34】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;收件人列…

eks实践案例

Eks&#xff1a; ami-0c23197c88296c1b5 eks集群&#xff1a; 拉面 - 知乎 https://blog.csdn.net/saynaihe/category_12204222.html 什么是 Amazon EKS&#xff1f; - Amazon EKS kubectl 使用指南 https://zhuanlan.zhihu.com/p/364994610 k8s HPA自动伸缩 手把手教你 K8…

centOS7忘记登录密码该如何重新修改登录密码

文章目录 前言一、重新修改登录密码1.1、第一步1.2、第二步1.3、第三步1.4、第四步1.5、第五步1.6、第六步1.7、第七步1.8、第八步 前言 忘记密码并不可怕&#xff0c;只要学会方法&#xff0c;密码随时都可以找回。 一、重新修改登录密码 1.1、第一步 当打开centOS7之后忘记…

flutter系列之:做一个修改组件属性的动画

文章目录 简介flutter中的动画widgetAnimatedContainers使用举例总结 简介 什么是动画呢&#xff1f;动画实际上就是不同的图片连续起来形成的。flutter为我们提供了一个AnimationController来对动画进行详尽的控制&#xff0c;不过直接是用AnimationController是比较复杂的&a…

Colab使用教程(自己胡乱弄了半天,发现不行,还是得学一下)

文章目录 在google云盘中创建笔记本&#xff0c;并红设置笔记本的运行环境常见设置挂载云硬盘更改工作目录移动训练数据防止断链设置方法一、控制台设置方法二、安装Colab Alive 训练结果保存到硬盘中相关链接 在google云盘中创建笔记本&#xff0c;并红 云盘链接&#xff0c;…

K公司项目文件管理系统的分析与设计_kaic

摘 要 2020年的新冠疫情促进了线上办公市场的发展&#xff0c;加快了企业进入全面数字化时代的脚步。办公自动化是当今的大趋势&#xff0c;越来越多的企业采用电子文档的形式存储内外部资料。K公司是一家致力于为政府和企业提供数据安全服务的小型B2B企业&#xff0c;公司承…