一、场景描述
commonModel :
提供公共的基础服务,比如工具类、常量类等等。
bussinessModel :
业务模块,是系统真正要实现的业务,依赖于 common 模块,比如订单管理、财务统计、会员管理等。
application :
可发布的 web 应用,由各个 bussinessModel 组成,最终满足项目整体需求。
第三方模块:
包括各类框架,Spring、MyBatis、日志等。整个应用都是依赖它们完成开发的。
二、如何使用 Maven 管理上述的结构
Maven 管理多模块应用的实现是互联网项目中多使用分布式开发,那么每个独立的服务都会使用独立的项目进行维护,那么这样就需要使用多模块应用管理,来实现项目的高度统一。
1. 第一种实现方式
项目名称:maven-modules-project
完成功能:使用 IntelliJ IDEA 实现 Maven 管理多模块的应用开发
A、创建 Project 为 Empty Project
Project name:项目名称
Project location:项目存放位置
B、创建 Maven 的父工程
设置模块存放位置,和项目的GAV坐标
GroupId :公司域名的倒序
ArtifactId :项目或模块名称
Version :项目或模块版本号
父工程的 packaging 标签的文本内容必须设置为 pom。
父工程要求 src 目录必须删除掉。
C、创建子模块
模块名称 :maven-java,是 maven-parent 父工程的子模块
Parent:选择模块的父工程
GroupId:选择父工程后,默认继承父工程的 GroupId 值
ArtifactId:模块的项目名称
Version:选择父工程后,默认继承父工程的 Version 值
子模块项目的 pom 文件
parent 标签:指向父工程
relativePath 标签:相对路径
D、设置父工程编译级别
执行效果:
项目中会统一使用 JDK 版本和编译级别,所以项目的编译级别必须统一一致,那么将编译插件添加到父工程,子模块依然会无条件去继承父工程的插件。
指定编译级别前:
在 File —> Settings ----> Build、Execution、 Deployment —> Compiler —> Java Compiler 查看
在父工程的 build —> plugins 标签中添加编译插件
指定编译级别后,版本由 1.5 变成 1.8
E、父工程添加依赖
执行后效果:
在父工程 dependencies 标签中添加 MySQL 依赖,子模块会无条件继承父工程所有依赖。
添加 MySQL 依赖前:
添加 MySQL 依赖 (父工程 pom 文件)
添加 MySQL 依赖后
F、父工程管理依赖版本号
以上写做法,子模块会无条件继承父工程的所有依赖,导致的问题是,本不需要的继承的依赖也会被继承,这就大大增加了项目模块最终打包的大小,也可能未上线埋下了隐患。
也就是说,父工程管理的是所有项目模块的依赖,而不是某一个项目模块的依赖,所以某一个项目模块不需要继承父工程中的所有依赖,这就需要子项目模块向父工程声明需要的、依赖即可(声明式依赖)。而此时,父工程实际只需要管理依赖的版本号即可。
实现方式如下:
父工程添加 dependencyManagement 前
父工程添加 dependencyManagement 标签管理依赖
父工程添加 dependencyManagement 后
子模块项目之前继承的依赖消失,由于父工程通过 dependencyManagement 标签管理依赖,那么之前子模块无条件继承的依赖就全部消失。
父工程添加 properties 管理版本号
在 properties 标签中,可以自定义标签名称来管理依赖的版本号,通常自定义的标签名称由 “项目名称” + version 英文单词构成。被管理的依赖版本号由 “${算定标签名称}” 来代替。
子模块声明式添加依赖
由于父工程管理依赖的版本号,那么子模块要想继承依赖,只能通过声明式来添加依赖。实际上,子模块中的依赖是继承父工程依赖的版本号,如果子模块已定义依赖版本号,那么以子模块定义的版本号为准。
2. 第二种实现方式
子模块处于父模块中
在父工程的 dependencies 标签里添加 MySQL 依赖,子模块会无条件继承父工程所有依赖。
管理版本号的方式同上。