Maven多模块项目架构配置介绍和实战
1.SpringBoot与MyBatis零XML配置集成和集成测试
2.Maven多模块项目架构配置介绍和实战
3.SpringBoot如何让业务Bean优先于其他Bean加载4.Flutter/Dart第01天:Dart安装和初体验5.Flutter/Dart第02天:Dart基础语法(建议收藏)6.Flutter/Dart第03天:Dart可迭代集合7.Flutter/Dart第04天:Dart异步编程(Future和async/await)8.Flutter/Dart第05天:Dart特殊特性Mixin详解9.Flutter/Dart第06天:Dart基础语法详解(变量)10.Flutter/Dart第07天:Dart基础语法详解(库、导入和关键字)11.Flutter/Dart第08天:Dart类型(内置类型、记录、集合、泛型和类型别名)12.Flutter/Dart第09天:Dart高级特性Pattern模式的概览和用法13.Flutter/Dart第10天:Dart高级特性Pattern模式的全部类型(共15种)14.Flutter/Dart第11天:Dart函数方法详解15.Flutter/Dart第12天:Dart控制流详解16.Flutter/Dart第13天:Dart错误处理17.Mac电脑80端口被占用的2种解决办法18.Flutter/Dart第14天:Dart类详解19.Flutter/Dart第15天:Dart类构造函数20.Flutter/Dart第16天:Dart类方法21.Flutter/Dart第17天:Dart类继承22.Flutter/Dart第18天:Dart特性之可调用对象23.Flutter/Dart第19天:Dart高级特性之扩展方法(Extension methods)24.Flutter/Dart第20天:Dart 3.0新特性之类型修饰符25.Flutter/Dart第21天:Dart异步编程(Future/Stream)26.FlutterApp实战·第01天:Flutter安装和配置27.Python深入理解*和**含义和应用28.[每日AI·0430]首个自主更新的多模态大模型,马斯克访华,文本一键转3D数字人骨骼动画,创新的虚拟试衣模型29.国内免费的AI工具出色地帮我辅导女儿的小学英语作业30.[每日AI·0506]巴菲特谈 AI,李飞飞创业,苹果或将推出 AI 功能,ChatGPT 版搜索引擎31.玩转AI,笔记本电脑安装属于自己的Llama 3 8B大模型和对话客户端32.一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南33.基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人34.Python游戏编程:一步步用Python打造经典贪吃蛇小游戏35.借助AI大模型,三分钟原创一部儿童故事短视频(附完整操作步骤)36.[AI资讯·0531] 达摩院医疗AI新里程碑,OpenAI价值数十亿美元,微软投资130亿美元,百度文库成为一站式AI内容获取与创作平台,三大运营商完成AI产品市场,AI获得成功PMF需多次尝试……37.ngrok内网穿透,实现外网访问ChatTTS/Qwen2等大模型应用原文地址:https://ntopic.cn/p/2023071501/
源代码先行:
- Gitee多模块项目仓库:https://gitee.com/obullxl/ntopic-boot
- GitHub多模块项目仓库:https://github.com/obullxl/ntopic-boot
背景介绍
我们项目采用的是Maven多模块架构,我发现项目的部分子模块的pom.xml中重复引用了相同的JAR包。很明显,当初在配置Maven模块的时候,没有考虑清楚各个模块的架构职责,同时也不了解Maven模块依赖的传递性。本文主要介绍一下Maven多模块的配置思路和多模块的配置实操。
Maven多模块配置
在实操之前,我们先要了解配置概览,配置大致可分为三大步:确定项目需要哪几个模块,项目中的每个模块的依赖关系如何,最后根据依赖关系配置。
第一步:确定项目的模块划分
模块的划分没有任何强制要求,一般的划分思路如下:
- test 集成测试模块:该模块除了测试用例代码外,没有实际业务逻辑。项目中我们用junit和Mockito测试框架比较多,Mockito集成测试框架和SpringBoot集成可我之前的博客:https://ntopic.cn/p/2023052001/
- facade 对外服务接口模块(如果有的话,一般业务类项目较小,服务类较大):主要是对外提供服务接口、请求参数和返回结果等JAR包,其他项目需要依赖项目JAR包,因此需要单独一个模块
- client 集成外部服务接口模块:和facade对应,如果依赖了外部服务的话
- lang 基础公用模块:各个模块都会依赖的公共类模块,比如常用工具类、通用枚举等
- das 数据访问模块:接入DB层的代码,包括DO/DAO等
- service 领域核心服务模块:各个业务领域的核心服务逻辑
- web/biz 业务模块:业务逻辑模块。如果业务比较复杂,可进一步拆分,如web-user/web-order等
根据上面说明,https://gitee.com/obullxl/ntopic-boot的模块划分如下:
- ntopic-test 集成测试模块
- ntopic 业务逻辑模块,包括SpringBoot启动类、Web模块、业务模块等
- ntopic-servcie 领域核心服务
- ntopic-client 外部服务器集成
- ntopic-das DB操作
- ntopic-lang 公共模块
IDEA代码结构 | GitHub代码样例 |
---|---|
![]() |
![]() |
第二步:确定各个模块的依赖关系
Maven模块的依赖具备传递性,即:若模块A依赖了模块B,模块B依赖了模块C,则模块A自动依赖了模块C(有点类似于数学中数值大小的传递性,A>B且B>C,则A>C)。
https://gitee.com/obullxl/ntopic-boot项目的各个模块依赖关系说明:
- ntopic-test 集成测试模块:因为集成测试包括了所有的代码逻辑,所以它处于最上层
- ntopic 业务模块,业务逻辑依赖service模块提供核心服务
- ntopic-service 核心服务模块,它依赖DB数据读写和引入外部服务
- ntopic-lang 公共逻辑模块,它进一步依赖其他统一模块,如commons模块等
第三步:Maven多模块实操
多模块的核心在pom.xml文件中,任何一个pom.xml模块,都需要指定五个核心配置元素:
- groupId 代表大分组,一般都是公司的域名,如 cn.ntopic / com.aliaba 等
- artifactId 代表具体的JAR包名,如 sequence-jdbc / fastjson 等
- version 代表JAR包版本,如 1.0.1 / 1.2.76 等
- packaging 代表模块打包方式,默认都是jar,对于多模块的总模块或者父模块为pom
- name 代表模块名称,可选配置,建议配置
总pom.xml文件
总pom.xml配置了整个项目的所有信息,包括项目的模块列表、依赖的JAR包、仓库和打包方式等。
- 指定父模块:可选的,可以没有父模块。如ntopic-boot是基于SpringBoot框架,所以它的父模块是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.5.3</version> <relativePath/> </parent> <groupId>ntopic</groupId> <artifactId>ntopic-parent</artifactId> <version>1.0.1</version> <packaging>pom</packaging> <name>ntopic-parent</name>
- 指定模块本项目的模块列表:
<modules> <module>ntopic-test</module> <module>ntopic</module> <module>ntopic-service</module> <module>ntopic-das</module> <module>ntopic-client</module> <module>ntopic-lang</module> </modules>
- 模块依赖管理,各个子模块中,可以直接使用这里配置的依赖:
<dependencyManagement> <dependencies> <!-- NTopic Modules --> <dependency> <groupId>ntopic</groupId> <artifactId>ntopic-lang</artifactId> <version>${ntopic.version}</version> </dependency> <dependency> <groupId>ntopic</groupId> <artifactId>ntopic-client</artifactId> <version>${ntopic.version}</version> </dependency> <!-- 其他本项目子模块忽略 --> <!-- SpringBoot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>${springboot.boot.version}</version> </dependency> <!-- Google Guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version> </dependency> <!-- 其他省略 --> </dependencies> </dependencyManagement>
- 额外的Maven仓库和打包方式配置:
<repositories> <repository> <id>Gitee-obullxl</id> <url>https://gitee.com/obullxl/maven-repository/raw/sequence-jdbc</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${springboot.boot.version}</version> </plugin> </plugins> </build>
子模块pom.xml文件
总模块配置好了之后,子模块的配置就简单多了,只需要配置3个信息块:父模块、四元素和依赖其它子模块。其中依赖的子模块按照第二步中的依赖关系配置即可:
<?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>ntopic</groupId> <artifactId>ntopic-parent</artifactId> <version>1.0.1</version> </parent> <artifactId>ntopic-service</artifactId> <packaging>jar</packaging> <version>${ntopic.version}</version> <name>ntopic-service</name> <dependencies> <!-- NTopic Module --> <dependency> <groupId>ntopic</groupId> <artifactId>ntopic-das</artifactId> </dependency> <dependency> <groupId>ntopic</groupId> <artifactId>ntopic-client</artifactId> </dependency> </dependencies> </project>
编译项目各个模块
经过上面的配置,项目Maven多模块架构已经配置完成,进行项目编译即可:
mvn compile
编译成功的结果:
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] ntopic-parent ...................................... SUCCESS [ 0.022 s] [INFO] ntopic-lang ........................................ SUCCESS [ 0.873 s] [INFO] ntopic-das ......................................... SUCCESS [ 0.121 s] [INFO] ntopic-client ...................................... SUCCESS [ 0.042 s] [INFO] ntopic-service ..................................... SUCCESS [ 0.055 s] [INFO] ntopic ............................................. SUCCESS [ 0.073 s] [INFO] ntopic-test ........................................ SUCCESS [ 0.114 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.094 s [INFO] Finished at: 2023-07-15T13:41:57+08:00 [INFO] Final Memory: 35M/448M [INFO] ------------------------------------------------------------------------
本文作者:奔跑的蜗牛,转载请注明原文链接:https://ntopic.cn
合集:
专业技术
分类:
专业技术 / 架构设计
, 专业技术 / Maven
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 易语言 —— 开山篇