当前位置: 首页 > news >正文

spring一个项目多个模块聚合打包问题解决方案

文章目录

  • 1.问题描述:
  • 2.解决方案
    • 一、创建聚合父工程
    • 二、创建子模块(module)
    • 三、编写子模块代码
      • 1.模块1(demo-one)
      • 2.模块2(demo-tow)
    • 四、创建聚合模块 (demo-starter)
      • 1. starter聚合模块pom配置 (依赖子模块很重要)
    • 五、打包测试
    • 六、最后的最后 测试一下效果

1.问题描述:

最近遇到个需求,针对后端解耦模块较多的项目,想在云端启动时简洁些只启动一个jar文件的情景。
1)解耦较细多个子module一个项目下
2)只想打到一个包启动一次
3)原解耦架构不想打破、不想重构

2.解决方案

针对此问题spring原生自带处理方式,下面写个demo

一、创建聚合父工程

1.首先使用 Spring Initializr 来快速创建好一个Maven工程。然后删除无关的文件,只需保留pom.xml 文件。这里命名 demo-Project。
在这里插入图片描述
2.然后在 pom.xml 里面声明该父工程包含的子模块。(其它信息就不逐一讲述了,诸如继承SpringBoot官方父工程以及统一依赖管理 请查看下面的注释说明)

<?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.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><packaging>pom</packaging><groupId>com.example</groupId><artifactId>demo-Project</artifactId><version>0.0.1-SNAPSHOT</version><name>demo-Project</name><description>demo-Project</description><modules><module>demo-starter</module><module>demo-one</module><module>demo-tow</module></modules><properties><java.version>1.8</java.version></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><!--    <build>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>--></project>

二、创建子模块(module)

分别调整它们的pom.xml 以继承上面的父工程。
例如demo-one模块的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.example</groupId><artifactId>demo-Project</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><groupId>com.example</groupId><artifactId>demo-one</artifactId><version>0.0.1-SNAPSHOT</version><name>demo-one</name><description>demo-one</description><properties><java.version>8</java.version></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><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><!--    <build>-->
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
<!--    </build>--></project>

三、编写子模块代码

在这里插入图片描述
注:正常是控制层、业务层、数据层等的解耦,目前是简单多业务架构模式假设每模块里都有自己的service、entity、repo、service等层次代码只是demo简单写了。

1.模块1(demo-one)

启动类 :DemoOneApplication.java (demo-one)

package com.example.demoone;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoOneApplication {public static void main(String[] args) {SpringApplication.run(DemoOneApplication.class, args);}}

控制器:ConTeone.java (demo-one)

package com.example.demoone.controler;import com.example.demoone.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConTeone {@AutowiredUser user;@PostMapping("/contest1")public String test1(){return "test1";}@PostMapping("/contest1/onebean")public User test2(){return user;}
}

javabean User类:

package com.example.demoone.bean;import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;import java.io.Serializable;@Data
@Component
@ConfigurationProperties(prefix = "user")
@JsonSerialize
public class User{String username;String password;
}

配置文件:application.yml (demo-one)

server:port: 8081user:username: adminpassword: admin
spring:profiles:active: true

2.模块2(demo-tow)

启动类 :DemoTowApplication.java (demo-tow)

package com.example.demotow;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoTowApplication {public static void main(String[] args) {SpringApplication.run(DemoTowApplication.class, args);}}

控制器:Contest.java (demo-tow)

package com.example.demotow.controler;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Contest {@PostMapping("/contest2")public String testTow(){return "test2";}
}

配置文件:application.yml (demo-tow) 这个不配了没写特殊的东西,只是在demo-one里写了从yml配置好做演示。

四、创建聚合模块 (demo-starter)

创建聚合模块 它的pom.xml 以继承上面的父工程。代码为普通的spring-web的项目即可,拥有初始的 启动类即可。但是启动类需要开启包路径扫描。
要求:
1)开启包扫描;
2)要继承 子模块demo-one、demo-tow;
3)要有打包插件配置 spring-boot-maven-plugin;
4)其他子模块需要去掉打包插件 这很重要。

1. starter聚合模块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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo-starter</artifactId><version>0.0.1-SNAPSHOT</version><name>demo-starter</name><description>demo-starter</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>com.example</groupId><artifactId>demo-one</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.example</groupId><artifactId>demo-tow</artifactId><version>0.0.1-SNAPSHOT</version></dependency><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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.starter聚合模块开启包扫描 (很重要)
在这里插入图片描述
特别注意:如果子模块包路径和启动类的根路径一致,不加上述注解也可,我这就是一样的但是为了演示所以还是配置了。

五、打包测试

万事俱备直接打包测试即可了。

在父pom的项目路径下打包

mvn clean package

在这里插入图片描述

打出来的包 在 demo-starter所在的路径里,当然运行 install 在本地仓库找也可;发布制品库的话直接发布上去的也是 demo-starter;
在这里插入图片描述

六、最后的最后 测试一下效果

启动 demo-starter

java -jar .\demo-starter-0.0.1-SNAPSHOT.jar

在这里插入图片描述
demo-one的 返回User的接口
在这里插入图片描述
demo-one 的返回string的接口
在这里插入图片描述
demo-tow的返回string的接口
在这里插入图片描述

相关文章:

spring一个项目多个模块聚合打包问题解决方案

文章目录 1.问题描述&#xff1a;2.解决方案一、创建聚合父工程二、创建子模块&#xff08;module&#xff09;三、编写子模块代码1.模块1&#xff08;demo-one&#xff09;2.模块2&#xff08;demo-tow&#xff09; 四、创建聚合模块 &#xff08;demo-starter&#xff09;1. …...

Linux设备树(Device Tree)何时被解析

Linux设备树&#xff08;Device Tree&#xff09;是在内核启动阶段就会被解析。当 Linux 内核启动的时候&#xff0c;它会读取设备树文件&#xff08;dtb文件&#xff09;并根据里面的信息来组织设备、加载驱动等。在驱动代码里&#xff0c;通常我们是在驱动初始化&#xff08;…...

【Elasticsearch】数据简单操作(二)

简介&#xff1a;Elasticsearch&#xff08;ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点&#xff0c;被广泛用于构建实时搜索、日志分析、数据可视化等应用。 本文主要介绍ES索引的操…...

4 vCPU 实例达成 100 万 JSON API 请求/秒的优化实践

“性能工程” &#xff08;Performance engineering&#xff09;是个日渐流行的概念。顾名思义“性能工程”是包含在系统开发生命周期中所应用的一个技术分支&#xff0c;其目的就是确保满足非功能性的性能需求&#xff0c;例如&#xff1a;性能、可靠性等。由于现代软件系统变…...

呼叫中心系统有什么优势

在随着企业的管理水平也在不断提高。企业经营管理中所涉及到的各种复杂问题都有逐渐凸显出来。传统的呼叫中心已无法满足企业服务需求和客户满意度变化的要求。因此通过呼叫中心系统将企业业务流程和数据整合起来进行管理和运营已经成为目前企业管理领域中较为流行和成熟之选。…...

如何在linux操作系统下安装nvm

本文主要介绍如何在linux操作系统下安装nvm&#xff0c;如果想知道nvm如何在windows操作系统下使用&#xff0c;请参考文章如何通过nvm管理多个nodejs版本_nvm 查看所有node版本-CSDN博客。 1、nvm下载 nvm全称Node Version Manager&#xff0c;即Node版本管理器。访问官网地址…...

Linux 入门:基本指令

本篇文章来介绍我们在初学Linux时可以会碰倒的一些基本指令&#xff0c;让我们对这些指令有一个基本的了解。 目录 01. ls 指令 02. pwd 命令 03. cd 指令 04. touch 指令 05. mkdir 指令&#xff08;重要&#xff09; 06. rmdir指令 && rm 指令&#xff08;重…...

IP转地理位置:探讨技术与应用

IP地址是互联网上设备的唯一标识符&#xff0c;而将IP地址转换为地理位置信息是网络管理、安全监控和市场定位等领域中的一项重要任务。本文将深入探讨IP转地理位置的技术原理和各种应用场景。 IP地址与地理位置 IP地址&#xff08;Internet Protocol Address&#xff09;是一…...

关于埋点上报

一、埋点上报结构包含哪些&#xff1f; 埋点上报结构一般包含以下信息&#xff1a; 事件名称&#xff1a;标识上报的是哪个事件&#xff0c;例如“注册成功”或“点击按钮”等。事件发生时间&#xff1a;记录事件发生的时间戳。用户ID&#xff1a;标识事件所属的用户。设备信息…...

最新博客园图片上传接口,模拟实现图片上传

简单看了一下博客园的图片上传接口&#xff0c;可以拿来做图床工具&#xff0c;仅供参考学习&#xff0c;请勿滥用。 1、实例代码 #!/usr/bin/python # -*- coding: UTF-8 -*- """ author: Roc-xb """import requestsurl "https://uplo…...

ROS2 从头开始:第 08/8回 - 使用 ROS2 生命周期节点简化机器人软件组件管理

一、说明 欢迎来到我在 ROS2 上的系列的第八部分。对于那些可能不熟悉该系列的人,我已经涵盖了一系列主题,包括 ROS2 简介、如何创建发布者和订阅者、自定义消息和服务创建、...

Vue组件库Element

目录 Vue组件库ElementElement简介Element快速入门环境配置Element常用组件Table表格Table表格演示Table表格属性详解 Pagination分页Pagination分页演示Pagination分页属性详解Pagination分页事件详解 Dialog对话框Dialog对话框组件演示Dialog对话框属性详解 Form表单Form表单…...

broadcast自动扩展

broadcast&#xff1a; 1、能够进行维度扩展&#xff0c;是自动的2、在扩展的时候不需要拷贝数据要点&#xff1a; - 从最小的维度开始匹配&#xff0c;如果前面没有维度了&#xff0c;在前面插入一个新的维度。- 插入的新维度size是1&#xff0c;再将其扩展为与目标相同大小si…...

【Pm4py第七讲】关于visualization

本节用于介绍pm4py中的可视化函数&#xff0c;包括可视化bpmn、petri、性能图谱、变迁系统等。 1.函数概述 本次主要介绍Pm4py中一些常见的可视化函数&#xff0c;总览如下表&#xff1a; 函数名说明view_alignments(log, aligned_traces[, format])可视化对齐方法 view_bpmn(…...

通过 BigQuery 中的 11 个新链增强 Google Cloud 的区块链数据服务

2018 年初&#xff0c;Google Cloud 与社区合作&#xff0c;通过BigQuery 公共数据集实现区块链数据民主化&#xff1b;2019 年&#xff0c;又扩展了六个数据集&#xff1b;今天&#xff0c;我们在 BigQuery 公共数据集中添加了 11 个最受欢迎的区块链预览版。我们也在对该程序…...

C++笔记之文档术语——将可调用对象作为函数参数

C笔记之文档术语——将可调用对象作为函数参数 相关博文&#xff1a;C笔记之函数对象functors与可调用对象 文章目录 C笔记之文档术语——将可调用对象作为函数参数1.在函数参数中传递可调用对象2.‘在参数中传入可调用对象’和‘将可调用对象作为函数参数’哪个描述更加专业…...

【Android知识笔记】FrameWork中的设计模式

一、FrameWork中有哪些设计巧妙之处 例如: Binder调用,模糊进程边界: 屏蔽跨进程IPC通信的细节,让开发者把精力放在业务上面,无需关心进程之间的通信。Bitmap大图传输,高性能: 只传递Binder句柄,到目标进程后做内存映射,不用做大量数据拷贝,速度非常快。Zygote创建进…...

机器学习西瓜书+南瓜书吃瓜教程第三章学习笔记

本次学习为周老师的机器学习西瓜书谢老师南瓜书Datawhale视频 视频地址 下面为本人的学习笔记&#xff0c;最近很忙还没学多少&#xff0c;之后补&#xff01;&#xff01;&#xff01; u1s1&#xff0c;边看视频边自己手推一遍真的清楚很多&#xff0c;强烈推荐自己手推虽然花…...

JUnit5单元测试提示“Not tests were found”错误

JUnit5单元测试提示“Not tests were found”错误&#xff0c;如下图所示&#xff1a; 或者 问题解析&#xff1a; 1&#xff09;使用Test注解时&#xff0c;不能有返回值&#xff1b; 2&#xff09;使用Test注解时&#xff0c;不能使用private关键字&#xff1b; 存在以上情…...

C++ -- IO流

目录 C语言的输入与输出 CIO流 C标准IO流 C文件IO流 文件常见的打开方式如下 以二进制的形式操作文件 以文本的形式操作文件 读写结构体 stringstream的简单介绍 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输…...

手把手教你用AT32F403A实现串口空闲中断接收完整数据帧

深入解析AT32F403A串口空闲中断实现高效数据帧接收 在嵌入式系统开发中&#xff0c;串口通信是最基础也最常用的外设接口之一。面对实际应用中常见的不定长数据帧接收需求&#xff0c;传统轮询方式不仅效率低下&#xff0c;还容易丢失数据。而国产MCU雅特力AT32F403A提供的**串…...

CBAM实战指南:如何通过通道与空间注意力提升CNN模型性能

1. 为什么你的CNN模型需要CBAM注意力模块 如果你正在使用卷积神经网络&#xff08;CNN&#xff09;处理图像分类任务&#xff0c;可能会遇到这样的困境&#xff1a;模型在训练集上表现不错&#xff0c;但测试集准确率始终卡在一个瓶颈。这时候不妨试试CBAM&#xff08;Convolu…...

别再只盯着芯片手册了!用CC6902SO搭建电流检测电路,这些实测数据和避坑经验更重要

别再只盯着芯片手册了&#xff01;用CC6902SO搭建电流检测电路&#xff0c;这些实测数据和避坑经验更重要 第一次用CC6902SO搭建电流检测电路时&#xff0c;我完全按照芯片手册推荐的电路设计&#xff0c;结果发现实际输出和理论值差了将近15%。这让我意识到&#xff0c;真正影…...

传统文化与现代AI结合:Guohua Diffusion国风绘画商业应用案例

传统文化与现代AI结合&#xff1a;Guohua Diffusion国风绘画商业应用案例 1. 国风绘画生成工具概述 Guohua Diffusion是一款专为国风绘画设计的本地生成工具&#xff0c;基于原生Guohua-Diffusion模型开发。这款工具完美融合了中国传统绘画艺术与现代AI技术&#xff0c;为艺术…...

利用kimi与快马平台,十分钟搭建个人博客web应用原型

最近想快速验证一个个人博客的创意&#xff0c;但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型&#xff0c;没想到十分钟就搞定了可运行的Web应用&#xff0c;分享下这个高效流程&#xff1a; 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...

PyTorch张量操作实战:从基础运算到CNN应用

1. PyTorch张量基础&#xff1a;从概念到创建 第一次接触PyTorch张量时&#xff0c;我完全被各种术语搞晕了。什么标量、向量、矩阵&#xff0c;还有这个奇怪的"张量"词。后来才发现&#xff0c;其实张量就是多维数组的另一种说法&#xff0c;只不过在深度学习中我们…...

大麦网自动购票工具:技术原理与多场景应用指南

大麦网自动购票工具&#xff1a;技术原理与多场景应用指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 在数字化票务时代&#xff0c;热门演出门票往往在开票瞬间售罄&…...

用YOLOv8在树莓派上跑个‘狗脸识别’:斯坦福犬类数据集实战与轻量化部署指南

树莓派上的智能犬种识别&#xff1a;YOLOv8轻量化部署全流程实战 当你在公园遛狗时&#xff0c;有没有遇到过路人好奇询问狗狗品种的情况&#xff1f;传统的犬种识别往往依赖专业兽医或资深养犬人士的经验判断&#xff0c;而今天我们将用一块信用卡大小的树莓派&#xff0c;配合…...

PaddleX印章识别实战:5分钟搞定Seal-Recognition模型部署(附避坑指南)

PaddleX印章识别实战&#xff1a;从零部署到高效应用的完整指南 印章识别在合同审核、公文归档等场景中需求旺盛&#xff0c;但传统方案往往面临部署复杂、适配困难等问题。PaddleX推出的Seal-Recognition模型通过预训练产线低代码API的方式&#xff0c;让中小团队也能快速获得…...

3步安装ViGEMBus虚拟手柄驱动:让Windows游戏体验全面升级

3步安装ViGEMBus虚拟手柄驱动&#xff1a;让Windows游戏体验全面升级 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows系统上使用任何手柄玩游戏…...