Spring Boot 3 多模块工程:从 30+ Maven 模块到 Open Core 双仓架构
久滴直播电商平台 · 技术博客系列 第 9 篇 标签Maven多模块Open Core工程架构前言当一个项目有 30 多个 Maven 子模块、同时需要维护开源版和商业版两个版本时工程架构的设计就变得至关重要。模块之间怎么组织版本号怎么统一管理两个版本怎么共享基础代码又各自独立构建久滴直播电商平台采用Open Core 双仓架构——Community 版MIT 开源和 Pro 版商业 EULA后端 30 Maven 模块通过三层结构和${revision}统一版本管理实现了一套基础、两个版本的灵活架构。本文将深入拆解这套方案。目录项目全景三层模块结构30 子模块的组织策略${revision} flatten-maven-plugin 统一版本管理Open Core 双仓架构yudao-dependencies BOM合规性实践LICENSE / NOTICE / 原作者保留1. 项目全景三层模块结构久滴后端的模块结构遵循经典的三层设计yudao根 POM ├── yudao-dependencies/ # 第一层依赖版本管理 BOM ├── yudao-framework/ # 第二层技术框架层 │ ├── yudao-common # 通用工具、枚举、异常 │ ├── yudao-spring-boot-starter-web │ ├── yudao-spring-boot-starter-mybatis │ ├── yudao-spring-boot-starter-redis │ ├── yudao-spring-boot-starter-security │ └── ... 15 个 starter ├── yudao-module-*/ # 第三层业务模块层 │ ├── yudao-module-system # 系统管理用户/角色/菜单/通知 │ ├── yudao-module-infra # 基础设施代码生成/文件/配置 │ ├── yudao-module-mall # 商城商品/订单/营销/支付 │ ├── yudao-module-live # 直播推拉流/IM/点播★ Pro │ ├── yudao-module-member # 会员等级/积分/签到 │ ├── yudao-module-circle # 圈子社区/热度排行★ Pro │ ├── yudao-module-museum # 博物馆 ★ Pro │ └── ... └── yudao-server/ # 启动入口聚合所有模块三层结构的职责dependencies只管版本号不包含任何代码framework只管技术能力不包含业务逻辑module只管业务实现按需引入 framework starter2. 30 子模块的组织策略api / biz 分离每个业务模块都拆分为api和biz两个子模块yudao-module-live/ ├── yudao-module-txlive-api/ # 接口层SPI 接口、DTO、枚举 └── yudao-module-txlive-biz/ # 实现层Service、Controller、DAO为什么要分离api模块可以被其他模块依赖如module-mall依赖module-live的 SPI 接口但不需要引入实现层的 Spring 依赖biz模块只在yudao-server中被引入避免模块间的循环依赖SPI 接口定义在api中实现在biz中完美配合条件装配模块间依赖管理模块间通过 API 接口进行通信而不是直接依赖 biz 模块// yudao-module-mall 的 pom.xmldependencygroupIdcn.iocoder.boot/groupIdartifactIdyudao-module-txlive-api/artifactIdversion${revision}/version/dependency这样module-mall可以调用module-live的LiveMarketingService接口但不会引入直播模块的全部依赖。3.${revision} flatten-maven-plugin 统一版本管理30 个模块如果各自维护版本号简直是一场灾难。久滴平台使用 Maven CI-Friendly Versions 方案根 POM 定义 revisionpropertiesrevision2026.06-pro-SNAPSHOT/revisionyudao.community.version2026.06-SNAPSHOT/yudao.community.version/propertiesgroupIdcn.iocoder.boot/groupIdartifactIdyudao/artifactIdversion${revision}/version子模块继承所有子模块都使用${revision}作为版本号!-- yudao-module-txlive-api/pom.xml --parentgroupIdcn.iocoder.boot/groupIdartifactIdyudao-module-live/artifactIdversion${revision}/version/parentflatten-maven-plugin${revision}在发布时需要被替换为实际版本号flatten-maven-plugin负责这个工作plugingroupIdorg.codehaus.mojo/groupIdartifactIdflatten-maven-plugin/artifactIdversion${flatten-maven-plugin.version}/versionconfigurationflattenModeresolveCiFriendliesOnly/flattenModeupdatePomFiletrue/updatePomFile/configurationexecutionsexecutionidflatten/idphaseprocess-resources/phasegoalsgoalflatten/goal/goals/executionexecutionidflatten.clean/idphaseclean/phasegoalsgoalclean/goal/goals/execution/executions/plugin执行mvn install时插件会自动生成.flattened-pom.xml将${revision}替换为2026.06-pro-SNAPSHOT。发版时只需改根 POM 一个地方# 从 SNAPSHOT 变为正式版mvn versions:set-property-Dpropertyrevision-DnewVersion2026.06-pro4. Open Core 双仓架构久滴平台采用Open Core模式——核心功能开源增值功能商业化┌──────────────────────────────────────────────┐ │ Community 版MIT │ │ │ │ yudao-framework │ │ yudao-module-system │ │ yudao-module-infra │ │ yudao-module-mall商品/订单/营销基础 │ │ yudao-module-member │ │ ... │ │ │ │ GitHub: jiudi-dev/live-mall-community │ └──────────────────────────────────────────────┘ ┌──────────────────────────────────────────────┐ │ Pro 版EULA │ │ │ │ 依赖 Community 版制品 │ │ │ │ yudao-module-live直播推拉流/IM/点播 ★ │ │ yudao-module-circle社区圈子/热度排行 ★ │ │ yudao-module-museum博物馆模块 ★ │ │ yudao-module-aiAI 增值功能 ★ │ │ pro-framework-extPro 框架扩展 ★ │ │ │ │ 云效 Packages / GitHub Private │ └──────────────────────────────────────────────┘Pro 仓的构建策略Pro 仓的pom.xml声明了双许可证licenseslicensenameMIT License (Community Edition)/nameurlhttps://opensource.org/licenses/MIT/urlcommentsCommunity Edition is released under the MIT License./comments/licenselicensenameLiveMall Pro Commercial EULA (Pro Edition)/nameurlhttps://kudi.net.cn/eula/urlcommentsPro Edition requires a signed EULA./comments/license/licensesPro 仓的revision使用-pro-后缀区分!-- Pro 仓版本2026.06-pro-SNAPSHOT --revision2026.06-pro-SNAPSHOT/revision!-- 依赖的 Community 版本 --yudao.community.version2026.06-SNAPSHOT/yudao.community.version5. yudao-dependencies BOMyudao-dependencies是一个 BOMBill of Materials模块集中管理所有第三方依赖的版本号dependencyManagementdependenciesdependencygroupIdcn.iocoder.boot/groupIdartifactIdyudao-dependencies/artifactIdversion${revision}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement子模块引入依赖时不需要指定版本号全部由 BOM 统一管理。好处是版本冲突一目了然升级某个依赖只需改 BOM 一个地方子模块的pom.xml更加简洁6. 合规性实践LICENSE / NOTICE / 原作者保留久滴平台基于芋道源码ruoyi-vue-pro二次开发遵循 MIT 协议的合规要求developers!-- 保留芋道源码原作者MIT 义务 --developeridYunaiV/idnameruoyi-vue-pro original author/nameurlhttps://github.com/YunaiV/urlrolesroleUpstream Author/role/roles/developer!-- LiveMall 团队 --developeridjiudi-team/idnameJiuDi Live-Mall Team/nameorganization久滴科技/organizationrolesroleMaintainer/role/roles/developer/developers项目还配置了许可证白名单管理includedLicensesincludedLicenseMIT License/includedLicenseincludedLicenseApache License, Version 2.0/includedLicenseincludedLicenseBSD 2-Clause License/includedLicense.../includedLicensesexcludedLicensesexcludedLicenseGNU Affero General Public License v3/excludedLicenseexcludedLicenseGNU General Public License v3.0/excludedLicenseexcludedLicenseServer Side Public License/excludedLicense.../excludedLicensesAGPL、GPL v3、SSPL 等具有传染性的开源协议被明确排除防止许可证风险。总结本文深入解析了久滴直播电商平台的工程架构设计三层模块结构dependencies版本管理→ framework技术框架→ module业务实现api/biz 分离接口层和实现层分离避免模块间循环依赖${revision}统一版本配合 flatten-maven-plugin改一处即全量生效Open Core 双仓Community 开源核心 Pro 商业增值共享基础代码合规性保障保留原作者信息、许可证白名单管理、MIT/EULA 双许可证声明下一篇我们将走进直播营销联动看看秒杀和优惠券如何推送到直播间弹幕流。久滴直播电商平台是一个基于 Spring Boot 3 Vue3 UniApp 的全栈开源直播电商解决方案。 GitHubhttps://github.com/jiudi-dev/live-mall-communityCommunity 版如果觉得本文对你有帮助欢迎 Star ⭐ 支持

相关新闻

python xml Python玩XML:SAX才是王道,DOM内存爆炸你怕不怕?

python xml Python玩XML:SAX才是王道,DOM内存爆炸你怕不怕?

资深软件开发工程师,业余马拉松选手。 XML虽说比JSON要来得更加复杂些, 于Web里的应用也不像先前那般多了, 然而依旧存在着不少地方在使用它, 因此, 很有必要知悉怎样对XML进行操作。 DOM vs SAX 解析XML, 存在着两种办法, 分别是DOM以及SAX。DOM会将整个XML读进…

2026/10/16 6:12:04 阅读更多 →
Python与PyCharm专业版完整安装激活指南:从环境配置到教育许可

Python与PyCharm专业版完整安装激活指南:从环境配置到教育许可

这次我们来看一个 Python 和 PyCharm 的完整安装与激活方案。对于刚入门编程或者需要配置新环境的开发者来说,最头疼的往往不是写代码,而是第一步——如何把 Python 解释器和 PyCharm 这个强大的 IDE 正确、稳定地装好,并且能长期使用。网上教…

2026/10/15 2:36:07 阅读更多 →
【一看就会】【nav2源码解析系列】【第三篇】--【基础算法实现类】--【控制类】--nav2_dwb_controller模块

【一看就会】【nav2源码解析系列】【第三篇】--【基础算法实现类】--【控制类】--nav2_dwb_controller模块

文章目录前言一、包结构二、输入输出核心输入输出三、代码逻辑流程第一层:外层computeVelocityCommands第二层:内层computeVelocityCommands第一步:填 results 头部(可选):如果用户请求记录评估结果&#x…

2026/10/10 23:31:20 阅读更多 →

最新新闻

airllm实战:低显存显卡部署大模型的思路与调优

airllm实战:低显存显卡部署大模型的思路与调优

大模型在消费级显卡上跑起来这件事,这几年从“做梦”变成了“日常”。但真到自己动手部署时,很多人的第一反应还是:我的显卡显存不够吧?确实,单是加载一个7B模型的fp16权重就要14G显存,老一点的20系列、30系…

2026/10/16 8:02:17 阅读更多 →
HarmonyOS ArkTS状态管理全解析:装饰器与数据驱动UI

HarmonyOS ArkTS状态管理全解析:装饰器与数据驱动UI

1. 项目概述1.1 先说清楚这是个什么东西最近在搞HarmonyOS应用开发,绕不开的就是ArkTS这套声明式语法。这套语言在ArkUI框架里扮演的是开发语言的角色,从HarmonyOS的早期版本一路演进到现在的API版本,写法和思路确实跟传统的前端开发不太一样…

2026/10/16 8:02:17 阅读更多 →
麻雀优化算法求解车间调度问题:从编码解码到Matlab实现

麻雀优化算法求解车间调度问题:从编码解码到Matlab实现

车间调度问题做优化,在很多制造类项目里都是绕不开的硬骨头。以前搞生产计划和排产,靠人工经验或者简单的优先规则(比如先到先得、最短加工时间优先),小规模场景还能应付,但一旦工件数量、机器数量上来&…

2026/10/16 8:02:17 阅读更多 →
Halcon 极坐标转换(Polar Transformation)详解与算子说明

Halcon 极坐标转换(Polar Transformation)详解与算子说明

Halcon 极坐标转换(Polar Transformation)详解与算子说明 参考来源:Halcon 17.12 Operator Reference — Filters/Geometric Transformations、Regions/Geometric Transformations、XLD/Geometric Transformations 章节 适用版本:Halcon 17.12(主基准)/ 20.11 / 22.11 / …

2026/10/16 8:02:17 阅读更多 →
平面设计配色全攻略:色轮、配色公式与实战技巧

平面设计配色全攻略:色轮、配色公式与实战技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 8:02:17 阅读更多 →
uni-app 滚动渐变头部组件实现:自定义导航栏与跨端适配

uni-app 滚动渐变头部组件实现:自定义导航栏与跨端适配

很多做跨端项目的朋友应该都有同感:uni-app 里列表页的头部渐变是一个出现频率极高的需求。尤其首页、详情页,上面通常是一张大图或者品牌色背景,顶部导航栏一开始要透出背景,等用户往下滚一段距离后再慢慢变成纯色底、压住内容。…

2026/10/16 8:01:17 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →