前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot多模块项目实践

SpringBoot多模块项目实践

作者头像
用户4283147
发布于 2022-10-27 03:39:24
发布于 2022-10-27 03:39:24
2.4K00
代码可运行
举报
文章被收录于专栏:对线JAVA面试对线JAVA面试
运行总次数:0
代码可运行

序言:

比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便。

接下来,本文将重点阐述SpringBoot在Maven环境的多模块构建过程。

本项目传送门:

https://github.com/yizhiwazi/springboot-socks/tree/master/springboot-integration

一、创建聚合父工程

1.首先使用 Spring Initializr 来快速创建好一个Maven工程。然后删除无关的文件,只需保留pom.xml 文件。

2.然后在 pom.xml 里面声明该父工程包含的子模块。(其它信息就不逐一讲述了,诸如继承SpringBoot官方父工程以及统一依赖管理 请查看下面的注释说明)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- 基本信息 -->
    <description>SpringBoot 多模块构建示例</description>
    <modelVersion>4.0.0</modelVersion>
    <name>springboot-integration</name>
    <packaging>pom</packaging>

    <!-- 项目说明:这里作为聚合工程的父工程 -->
    <groupId>com.hehe</groupId>
    <artifactId>springboot-integration</artifactId>
    <version>1.0.0.RELEASE</version>

    <!-- 继承说明:这里继承SpringBoot提供的父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
        <relativePath/>
    </parent>

    <!-- 模块说明:这里声明多个子模块 -->
    <modules>
        <module>mm-web</module>
        <module>mm-service</module>
        <module>mm-repo</module>
        <module>mm-entity</module>
    </modules>

    <!-- 版本说明:这里统一管理依赖的版本号 -->
    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>com.hehe</groupId>
                <artifactId>mm-web</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.hehe</groupId>
                <artifactId>mm-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.hehe</groupId>
                <artifactId>mm-repo</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.hehe</groupId>
                <artifactId>mm-entity</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.42</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

二、创建子模块(module)

注:这里是使用IDEA来创建子模块,使用Eclipse的小伙伴可通过 Spring Initializr 构建,然后复制去进去父工程根目录即可。

  1. 对着父工程右键 - New - Module - > 输入 mm-web
  2. 对着父工程右键 - New - Module - > 输入 mm-service
  3. 对着父工程右键 - New - Module - > 输入 mm-repo
  4. 对着父工程右键 - New - Module - > 输入 mm-entity

1~4 步骤完成后,分别调整它们的pom.xml 以继承上面的父工程。

例如mm-web模块的pom.xml 需要改造成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 基本信息 -->
    <groupId>com.hehe</groupId>
    <artifactId>mm-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>mm-web</name>

    <!-- 继承本项目的父工程 -->
    <parent>
        <groupId>com.hehe</groupId>
        <artifactId>springboot-integration</artifactId>
        <version>1.0.0.RELEASE</version>
    </parent>

    <!-- Web模块相关依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.hehe</groupId>
            <artifactId>mm-service</artifactId>
        </dependency>
        <dependency>
            <groupId>com.hehe</groupId>
            <artifactId>mm-entity</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

三、编写子模块代码

1.控制层(mm-web)

启动类 :MmWebApplication.java (mm-web)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
public class MmWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MmWebApplication.class, args);
    }
}

控制器:UserController.java (mm-web )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("/user/*")
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("list")
    public R list() {
        try {
           return R.isOk().data(userService.list());
        } catch (Exception e) {
            return R.isFail(e);
        }

    }

}

配置文件:application.yml (mm-web)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/socks?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

2.业务层(mm-service)

实现类:UserServiceImpl.java (mm-service)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class UserServiceImpl  implements UserService {

    @Autowired
    UserRepository userRepository;

    @Override
    public List<User> list() {
        return userRepository.findAll();
    }
}

3.数据层(mm-repo)

数据层代码:UserRepository.java (mm-repo)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface UserRepository extends JpaRepository<User,String> {
}

4.mm-entity (实体模型层)

R.java 作为统一返回的Bean对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class R<T> implements Serializable {

    private static final long serialVersionUID = -4577255781088498763L;
    private static final int OK = 0;
    private static final int FAIL = 1;
    private static final int UNAUTHORIZED = 2;

    private T data; //服务端数据
    private int status = OK; //状态码
    private String msg = ""; //描述信息

    //APIS
    public static R isOk(){
        return new R();
    }
    public static R isFail(){
        return new R().status(FAIL);
    }
    public static R isFail(Throwable e){
        return isFail().msg(e);
    }
    public R msg(Throwable e){
        this.setMsg(e.toString());
        return this;
    }
    public R data(T data){
        this.setData(data);
        return this;
    }
    public R status(int status){
       this.setStatus(status);
       return this;
    }


    //Constructors
    public R() {

    }

    //Getter&Setters

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
@Table(name = "T_USER")
public class User {

    @Id
    @Column(name = "USERID")
    private String userId;
    @Column(name = "USERNAME")
    private String username;
    @Column(name = "PASSWORD")
    private String password;

    //Getter&Setters
}

三、运行项目

为了更好的学习效果,建议先下载本项目,在IDE运行成功之后,然后再由自己手工敲一遍。

具体步骤:

1.首先下载好 springboot-socks,然后打开springboot-integration 工程。

2.安装Mysql数据库,然后创建数据库socks,并添加表t_user,插入数据如图:

3.配置好整个项目之后,这里只需要运行mm-web模块下的MmWebApplication的启动类就可以了,如正常启动后,访问http://localhost:8080 可查询到用户列表信息。如下图:

四、运维部署(多模块打包)

1.添加打包插件

注意:多模块项目仅仅需要在启动类所在的模块添加打包插件即可!!不要在父类添加打包插件,因为那样会导致全部子模块都使用spring-boot-maven-plugin的方式来打包(例如BOOT-INF/com/hehe/xx),而mm-web模块引入mm-xx 的jar 需要的是裸露的类文件,即目录格式为(/com/hehe/xx)。

本案例的启动模块是 mm-web , 只需在它的pom.xml 添加打包插件(spring-boot-maven-plugin):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--多模块打包:只需在启动类所在模块的POM文件:指定打包插件 -->
    <build>
        <plugins>
            <plugin>
                <!--该插件主要用途:构建可执行的JAR -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2.打包工程

首先在IDE打开Maven插件,然后在聚合父工程spring-boot-integration中点击 clean ,然后点击 package 进行打包。如图:

打包效果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] spring-boot-integration ............................ SUCCESS [ 0.000 s]
[INFO] mm-entity .......................................... SUCCESS [ 1.915 s]
[INFO] mm-repo ............................................ SUCCESS [ 0.235 s]
[INFO] mm-service ......................................... SUCCESS [ 0.218 s]
[INFO] mm-web ............................................. SUCCESS [ 0.891 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.798 s
[INFO] Finished at: 2017-10-18T17:17:02+08:00
[INFO] Final Memory: 35M/300M
[INFO] ------------------------------------------------------------------------

打包地址默认在Target目录:

3.启动项目

通过命令行启动项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xx\mm-web\target>java -jar mm-web-0.0.1-SNAPSHOT.jar

启动效果如下:


(完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 对线JAVA面试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
怎么看计算机的历史记录手机_科学计算器怎么查看历史记录
随便打开我的电脑或者浏览器,然后同时按下Ctrl+H组合键,窗口的左侧就会弹出浏览过的历史记录的小窗口,选择相应的日期之后下拉菜单后,会有浏览的网页记录和我的电脑(下图),双击我的电脑,出现的就是这一天你的电脑上的被浏览过的文件夹或文件(前提是,浏览者,并没有删除历史记录,因为在此,选中目标,单击右键选择删除,同样也是可以将今天的浏览记录删除
全栈程序员站长
2022/11/17
1.3K0
实用的Chrome浏览器命令
Chrome浏览器不仅是日常浏览网页的工具,还隐藏着一系列强大的命令行工具,可以帮助我们提高工作效率,解决一些常见的浏览器问题。本文将介绍几个实用的Chrome命令,讲解它们的用途、常见问题以及如何避免错误。
Jimaks
2024/05/06
5150
不是吧,浏览器主页可以这么酷炫吗?
不知道大家每天打开浏览器时,首页都是什么样子的呢?有些人喜欢直接使用搜索引擎的主页,有些人喜欢使用导航网站。而小妹喜欢搞一些自己定制的花里胡哨的主页,比如这样:
永恒君
2023/02/20
5350
不是吧,浏览器主页可以这么酷炫吗?
Chrome Extension 历史记录、下载记录和存储管理
在现代浏览器扩展开发中,如何高效地管理历史记录、优化下载体验,以及构建灵活的数据存储方案,已经成为开发者们关注的焦点。今天,我们将深入探讨 Chrome 提供的 历史浏览记录 API、下载管理 API 和 存储管理 API,并通过一个实用项目带你快速上手这些功能,让你的插件不仅智能,还贴心。
FunTester
2025/01/23
1510
Chrome Extension 历史记录、下载记录和存储管理
Chrome浏览器63版测试版新特性
以下描述的变化适用于测试版通道发布的安卓系统、Chrome OS系统、苹果系统和Windows系统上最新版的Chrome浏览器,注明除外。
疯狂的技术宅
2019/03/27
1.7K0
Github清除历史记录的方法
GitHub历史提交记录累计到一定程度以后,就很麻烦,体积大下载不便,压缩也慢,这时候就想永久性地删除掉没什么卵用的历史commit记录,但还要保留stars、forks、issues、tags等重要信息,因此不能删掉仓库重建一份,而要创建一个空分支,把旧分支给嘎掉!可是GitHub网站上不提供这种功能,所以只能通过命令行的形式来搞。首先使用 git checkout --orphan new 命令。
Jean
2023/02/10
2.4K0
Github清除历史记录的方法
如何清除Chrome浏览器301缓存?
1. 问题描述     HTTP响应码301表示永久转移,开发者在网站测试过程中应该尽量避免使用301永久跳转,而是使用临时转移码302,如果不慎使用了301跳转,则Chrome浏览器会本地缓存该永久跳转,当Chrome浏览器下次访问该网址时,并不会向该网址发送HTTP请求,而是使用本地301缓存,直接访问跳转后的网址。而此时如果想让跳转前网址直接响应200而不是301已经不行了,按照常规的缓存清理方法无法清除301缓存,对网站开发造成了干扰。本文将介绍一种清除301缓存的方法。 2. 如何清除3
joymufeng
2018/05/17
6K0
Git提交已忽略文件和清除历史记录
后来想到一个比较讨巧的方法,将打包后的 dist 文件也提交到 git,容器云拉取代码直接打镜像,时间大幅缩短,之前需要一个多小时的现在只需要不到一分钟。
德顺
2024/06/19
2800
如何使用chrome浏览器调试?
在chrome浏览器中打开http://localhost:3000,按F12,或者右击->单击【检查】.
贺贺V5
2018/08/21
1.1K0
如何使用chrome浏览器调试?
真实经历:手机浏览器被劫持了怎么办?
明月作为一名草根博客站长手机端拥有几个测试网站移动端效果的浏览器是很正常的吧,可就是在前两天入手了红米 5 Plus 后(可参考【新入手 红米 5 Plus 手机一个】一文)开始尝试了 Firefox、Chrome、EDGE、Via、夸克甚至小米原生浏览器都发现有被“劫持”的迹象。
明月登楼的博客
2019/05/15
37.3K0
真实经历:手机浏览器被劫持了怎么办?
Chrome浏览器调试技巧大全!
注:本文测试、截图均为Edge浏览器(内核是Chromium),浏览器内核可了解《有哪些浏览器/内核?[1]》
zz_jesse
2024/07/04
3730
Chrome浏览器调试技巧大全!
chrome浏览器 必知必会的小技巧
这篇文章主要介绍的就是一些chrome浏览器的小技巧,很简单,希望对大家有所帮助。 这其中的一些小技巧在低版本中是没有的,所以建议大家用最新版的,目前最新版是62,版本很重要,如果发现有些技巧不起作用,请先查看浏览器的版本。
FEWY
2019/05/27
9420
推荐一些chrome浏览器必装的插件!
Chrome浏览器已经作为开发者必不可少的工具,不仅仅使用其来搜索有价值的资料,解决各种难以解决的bug,同时,chrome浏览器的各种插件工具也可以大大的给我们带来便利。因此,今天就给大家推荐一些普通日常的插件。
好好学java
2021/07/28
2.6K0
推荐一些chrome浏览器必装的插件!
旧电脑回收前怎么清除数据
随着技术的快速更新换代,很多人的电脑也会不断的更新升级,比如给电脑升级硬件或是更换新电脑,从而获得更好的性能和体验。那么旧的电脑及电脑部件怎么处理更安全呢?我们要确保旧电脑上的个人数据被彻底清除干净,这样可以更好的保护个人隐私,还能防止重要信息泄露。本期内容,将和大家讨论一下旧电脑回收前或是转售之前如何清除数据,希望能为大家提供一些好的思路和方法。
用户7704932
2024/07/24
3060
旧电脑回收前怎么清除数据
Chrome浏览器必备插件推荐
Chrome浏览器对于我们现在互联网行业已经不可或缺,其实大部分使用Chrome浏览器的人更看重的是它的强大的插件功能,几乎提供的插件无所不能。
浅羽技术
2022/03/18
2K0
Chrome浏览器必备插件推荐
如何使用浏览器工具调试PWA
本教程说明了Chrome和Firefox的开发工具展示了什么样的工具,用于帮助用户调试PWA。
疯狂的技术宅
2019/03/27
3.9K0
如何使用浏览器工具调试PWA
centos7 shell 清除最近30条shell历史记录
在CentOS 7系统中,如果你想清除最近30条shell历史记录,而不是全部清空,bash shell并没有直接提供一个命令来删除特定数量的历史记录。但你可以通过编辑.bash_history文件或结合使用history命令和文本处理工具(如tail)来实现这一目的。
JaneYork
2024/05/25
2240
谷歌浏览器出现error_tunnel_connection_ failed的错误几种常见解决方法
google浏览器打不开网页解决办法,而且显示:“网页可能暂时无法连接,或者它已永久性地移动到了新网址,返回ERR_TUNNEL_CONNECTION_FAILED”
暮城
2022/02/23
7.4K0
LeetCode 5430. 设计浏览器历史记录
你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,你可以访问其他的网站 url ,也可以在浏览历史中后退 steps 步或前进 steps 步。
freesan44
2020/06/08
6360
如何查看系统更新的历史记录?
是山河呀
2025/03/23
2670
推荐阅读
相关推荐
怎么看计算机的历史记录手机_科学计算器怎么查看历史记录
更多 >
LV.1
中国地质大学(武汉)博士
目录
  • 序言:
  • 一、创建聚合父工程
  • 二、创建子模块(module)
  • 三、编写子模块代码
    • 1.控制层(mm-web)
    • 2.业务层(mm-service)
    • 3.数据层(mm-repo)
    • 4.mm-entity (实体模型层)
  • 三、运行项目
  • 四、运维部署(多模块打包)
    • 1.添加打包插件
    • 2.打包工程
    • 3.启动项目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档