Maven模块化项目核心是建立正确父子结构:父POM打包类型必须为pom,通过modules声明子模块路径,子模块用parent标签完整指向父坐标,并借助dependencyManagement统一版本、避免直接在父POM的dependencies中引入依赖。

Java 中用 Maven 配置模块化项目,核心是建立清晰的父子结构、明确模块职责、正确声明依赖关系。不是简单把多个 pom.xml 放进不同文件夹,而是靠一套约定好的配置逻辑让 Maven 识别、聚合、构建和管理各模块。
父模块必须设为 pom 打包类型
根目录下的 pom.xml 是整个项目的“总控中心”,它不编译业务代码,只做三件事:声明子模块、统一版本管理、集中插件配置。关键点如下:
-
必须显式写出,否则 Maven 完全忽略pom -
中列出所有子模块路径,如,路径区分大小写,且子模块文件夹必须在父模块目录下ntopic-lang -
在子模块中必须完整指向父模块的groupId、artifactId、version,推荐显式写避免向上误查
模块划分要符合职责边界
模块不是按技术分层硬拆,而是围绕复用性与变化频率来设计。常见合理划分包括:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- lang:放通用工具类、常量、枚举、基础异常等,被几乎所有模块依赖
- das:仅包含数据访问对象(DO/DAO)、MyBatis Mapper、数据库连接配置等
-
service:封装核心业务逻辑,依赖
das和lang,不直接暴露 Web 层细节 -
client:封装对外部服务(如 HTTP 接口、MQ、第三方 SDK)的调用,供
service使用 -
web 或 ntopic:Spring Boot 启动类、Controller、DTO、全局拦截器等,只依赖
service - test:集成测试模块,依赖全部其他模块,用于端到端验证
依赖管理要善用 dependencyManagement
父模块中用 统一声明依赖版本,但不实际引入;子模块需在自己 pom.xml 的 中显式写出坐标,才会真正拉取依赖。
- 例如父模块定义 Spring Boot 版本:
org.springframework.boot spring-boot-dependencies 3.2.4 - 子模块只需写:
,无需再写org.springframework.boot spring-boot-starter-web - 避免在父模块的
中直接加依赖,否则所有子模块都会强制引入,破坏模块独立性
IDE 导入和构建行为要对齐 Maven 规则
IntelliJ IDEA 或 Eclipse 不会自动理解模块关系,必须主动触发 Maven 导入:
- 在 IDEA 中:打开根目录 → 选 “Import project from external model” → 勾选 Maven → 确保 “Import Maven projects automatically” 开启
- 执行
mvn clean compile时,Maven 自动按依赖拓扑排序构建,比如先编译lang,再das,最后web - 执行
mvn install会将每个模块打包成 JAR 并安装到本地仓库(~/.m2/repository),供其他项目或跨模块引用 - 若模块未被识别,优先检查:子模块
pom.xml中是否正确、父模块路径是否拼写准确、子模块是否真正在父目录下
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










