做 Java 项目的朋友是不是一到多模块项目就头大?明明父模块写好了,子模块却总提示 “找不到父依赖”;打包时随便敲个
mvn package,结果因为模块依赖顺序错了,报一堆 “找不到类” 的错误;想给子模块加个公共工具类依赖,却不知道怎么在父模块里统一管理版本。别着急,兔子哥刚接触多模块项目时,就因为没把父模块安装到本地仓库,子模块引用时一直报错,折腾了一上午才发现问题;还有一次打包顺序搞反了,先打了依赖别人的模块,结果构建直接失败,后来才明白 “被依赖的模块要先打包”。今天就带大家把多模块项目的父子依赖配置、模块间依赖关系和打包顺序讲透,实战案例也安排上,新手跟着学,多模块项目再也不怕踩坑,一起往下看吧!一、为啥要做多模块项目?单模块不行吗?
基础问题:多模块项目好在哪?
小项目用单模块没问题,但项目大了之后,所有代码堆在一个模块里就会特别臃肿。比如一个电商项目,有商品管理、订单管理、用户管理等功能,单模块里类文件能堆几百个,改个商品模块的代码,整个项目都要重新打包,效率特别低。
多模块项目就像把大蛋糕切成小块,按功能拆成不同模块(比如
parent父模块、core核心模块、web接口模块),每个模块专注自己的功能。这样改核心模块的代码,只用重新打核心模块的包;其他模块想复用核心功能,直接加依赖就行,不用复制粘贴代码,维护起来特别方便。网友 “后端小李” 分享:“之前公司老项目是单模块,每次改一点东西都要等全量打包,至少 5 分钟;拆成多模块后,改 web 模块只用打 web 的包,1 分钟搞定,效率提升太多了!”
多模块项目的核心角色:父模块和子模块
- 父模块(parent):就像 “大家长”,负责管理子模块、统一依赖版本和配置,自己不写业务代码,打包方式固定为
pom。 - 子模块(module):负责具体功能,比如
core模块放实体类和服务接口,web模块放控制器和接口,子模块要继承父模块。
父模块和子模块的关系就像树干和树枝,树干(父模块)提供支撑和养分,树枝(子模块)生长各自的枝叶(功能)。
二、父子依赖配置:从创建到引用,一步都不能错
步骤 1:创建父模块,做好 “大家长”
父模块的 pom.xml 是核心,要声明子模块、统一管理依赖版本:
xml
<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.0modelVersion><groupId>com.shopgroupId><artifactId>shop-parentartifactId><version>1.0-SNAPSHOTversion><packaging>pompackaging> <name>shop-parentname><modules><module>shop-coremodule> <module>shop-webmodule> modules><dependencyManagement><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId><version>2.7.0version>dependency>dependencies>dependencyManagement>project>步骤 2:创建子模块,继承父模块
子模块要在 pom.xml 里通过
标签继承父模块,这样就能复用父模块的配置和依赖版本:xml
<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"><parent><groupId>com.shopgroupId><artifactId>shop-parentartifactId><version>1.0-SNAPSHOTversion>parent><modelVersion>4.0.0modelVersion><artifactId>shop-coreartifactId> <name>shop-corename><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starterartifactId> dependency>dependencies>project>步骤 3:子模块间依赖,按需引用
如果
shop-web模块需要用shop-core模块的功能,在shop-web的 pom.xml 里加依赖:xml
<dependencies><dependency><groupId>com.shopgroupId><artifactId>shop-coreartifactId><version>1.0-SNAPSHOTversion> dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency>dependencies>三、打包顺序:按规则来,不然构建准失败
为啥打包顺序这么重要?
多模块项目有依赖关系,比如
shop-web依赖shop-core,如果先打包shop-web,这时候shop-core还没打包安装到仓库,shop-web找不到shop-core的依赖,就会报 “找不到类” 的错误。正确的打包顺序就像盖房子:先打地基(父模块),再砌墙(被依赖的子模块),最后盖屋顶(依赖别人的子模块)。
打包顺序规则:记住这两条,错不了
- 先父模块,后子模块:父模块要先
install到本地仓库,子模块才能继承它的配置和依赖。 - 先被依赖模块,后依赖模块:比如
core被web依赖,就先打包core,再打包web。
| 模块类型 | 打包顺序 | 原因 |
|---|---|---|
| 父模块(parent) | 1 | 子模块依赖父模块的配置和版本 |
| 被依赖子模块(如 core) | 2 | 其他子模块(如 web)依赖它 |
| 依赖子模块(如 web) | 3 | 依赖已打包的 core 模块 |
实战打包命令:两种方式任你选
- 手动按顺序打包:
- 进入父模块目录,执行
mvn clean install(安装父模块到本地仓库)。 - 进入
shop-core目录,执行mvn clean install(安装 core 模块)。 - 进入
shop-web目录,执行mvn clean package(打包 web 模块)。
- 进入父模块目录,执行
- 在父模块一键打包:
进入父模块目录,直接执行mvn clean install,Maven 会自动按正确顺序打包所有子模块,推荐新手用这种方式,不容易出错。
兔子哥提醒:如果子模块间依赖关系复杂,手动顺序打包容易漏,在父模块执行一键打包最省心,Maven 会处理好内部顺序。
四、避坑指南:多模块配置和打包最容易踩的 6 个坑
- 子模块报 “找不到父模块”
原因:父模块没安装到本地仓库,子模块找不到父模块的依赖。解决:先在父模块执行mvn clean install,再处理子模块。 - 子模块名和文件夹名不一致
父模块里写的是shop-core,但子模块文件夹名叫shopCore,Maven 找不到子模块。解决:确保标签里的名字和子模块文件夹名完全一致。 - 子模块依赖版本和父模块不一致
父模块version是1.0-SNAPSHOT,子模块依赖写1.1-SNAPSHOT,导致找不到依赖。解决:子模块依赖版本必须和父模块版本一致。 - 父模块没加
dependencyManagement,子模块依赖版本混乱
父模块没统一管理版本,子模块各自写版本,导致版本冲突。解决:在父模块dependencyManagement里声明所有依赖版本,子模块引用时不写版本。 - 打包时跳过父模块,直接打子模块
新手直接进入子模块打包,没先处理父模块,导致子模块继承失败。解决:永远先处理父模块,再处理子模块。 - 子模块间循环依赖
core依赖web,web又依赖core,形成循环,打包时会报错。解决:梳理依赖关系,把公共代码抽到新模块(如common),避免循环依赖。
网友 “开发老周” 分享:“之前项目里 core 和 web 互相依赖,打包一直失败,后来把公共工具类抽到 common 模块,core 和 web 都依赖 common,循环依赖问题就解决了,模块拆分真的要理清关系。”
五、自问自答:多模块项目常问的问题
“子模块必须继承父模块吗?不继承行不行?”
可以不继承,但不推荐。继承父模块能统一依赖版本、复用配置,减少重复代码;不继承的话,每个子模块都要写一堆重复的配置,还容易出现版本冲突,新手尽量用继承。
“父模块里能写业务代码吗?还是只做管理?”
父模块最好只做管理,不写业务代码。父模块的
packaging是pom,打包后不会生成 jar 包,写了业务代码也没法被引用,业务代码一定要放在子模块里。“多模块项目在 IDEA 里怎么导入和运行?”
在 IDEA 里直接打开父模块的 pom.xml,选择 “Open as Project”,IDEA 会自动识别所有子模块;运行时在子模块的启动类上右键 “Run” 即可,IDEA 会自动处理模块间依赖。
结尾心得
多模块项目的核心其实是 “清晰的依赖关系 + 正确的打包顺序”。兔子哥的经验是,刚开始拆分模块别贪多,先按 “父模块 + 核心模块 + Web 模块” 的简单结构练手;配置父子依赖时,多检查坐标是否一致、父模块是否安装;打包时尽量在父模块一键执行,少手动按顺序打,避免出错。多模块项目看着复杂,其实只要理清谁依赖谁,按规则配置和打包,就会越用越顺手。当你看到改一个模块只需重新打一个包,而不是全项目重打时,就会觉得多模块的好处太多了,加油!
标签: maven.apache.org 多模块
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~