我知道Maven的效率让大家对它又爱又恨。现在有了gradle,自然是有了小甜甜,不要牛夫人的。但是Maven还是很有自己的一套的。
不知道有没有小伙伴使用Maven作多模块项目管理的?通常一个复杂的大型系统肯定由多个模块项目构成。使用Visual Studio开发过C#项目的小伙伴应该对此比较熟悉。它叫作solution。同样使用Maven的Java项目也可以构建包含多模块项目的工作集。通常它包含一个父项目以及若干个子项目。这样方便我们将多个前后端以及依赖的公共模块项目集中管理。
如果单纯使用Maven进行多模块的项目管理和代码编译打包肯定会简单很多。但是如果引入Spring Boot呢?很多小伙伴就会说你这不是废话么?原来怎么样,现在还怎么样就可以嘛。真的是这样么?!我看未必。不妨先让我们看一下使用Maven构建单个Spring Boot的项目。其中的爱恨情仇自有分晓。
1. 传统Spring Boot Maven项目
打开Spring官方关于[
开发
Spring Boot
第一个应用的手册
](docs.spring.io/spring-boot… Boot Maven项目的构建过程。我们也参照官方教程,回顾一下Spring Boot项目的构建过程。当然关于如何安装JDK以及Maven开发环境在这里不做过多介绍,请自行学习解决。
1.1. 创建Maven空白项目
具体的创建过程我在这边不作具体展开。因为和使用的开发环境有关。我依然使用的是Eclipse这个老古董。在Eclipse中,我们需要新建一个Maven Project。这样我们得到一个包含pom.xml的空白Maven Project。
1.2. 继承Spring Boot Parent
传统方法构建Spring Boot Maven项目需要引入Spring Boot StartParent模块。具体的做法就是在pom.xml中的project下面添加下面配置。指定当前Maven项目的父项目为spring-boot-starter-parent。
org.springframework.boot
spring-boot-starter-parent x.x.x
添加spring-boot-starter-parent的作用就是,它负责提供默认的Spring Boot应用需要的配置,并引入必要的Spring Boot需要的架包。
1.3. 引入Spring Boot核心功能包
假设我们需要构建的一个是RestFul服务的项目,那么我们还需要引入spring-boot-starter-web。不同于上面,这个架包以依赖的形式存在。我们需要将它放入pom.xml配置文件的dependencies配置点下:
org.springframework.boot spring-boot-starter-web
同理我们也可以依此增加更多功能模块,例如Redis:
org.springframework.boot
spring-boot-starter-data-redis
1.4. 打包可执行文件
最后我们完成所有功能的开发后,我们需要打包成一个可执行文件进行安装部署。我们还需要依赖spring-boot-maven-plugin。这个maven插件的功能就是可以将当前Spring Boot项目打包成一个可执行的可独立运行的架包。而我们需要做的就是在pom.xml中配置spring-boot-maven-plugin:
org.springframework.boot spring-boot-maven-plugin
2. 我们的问题
现在我们需要转个场。假设我们有一个系统需要有多个如上面这种Spring Boot项目也有可能有其他类型的Maven项目。那么像传统多模块Maven项目一样,在下面添加Maven Module项目作为子项目究竟会不会有问题?
可能眼尖的朋友已经看出问题出在哪里了。首先传统方式构建Spring Boot项目需要继承spring-boot-starter-parent来处理项目配置以及必要的模块引用。而它必须配置在pom.xml的parent中。那么作为子项目,它的parent究竟是谁?很显然肯定不是spring-boot-starter-parent。有人说为什么不多配置一个parent。显然这是不被允许的。
所以这里就有一个悖论:我要使用Spring Boot,那么parent必须是spring-boot-starter-parent。但是如果是一个子项目,parent又必须是父项目。这就是Spring Boot和Maven之间爱恨纠葛之一。
那么何解?!
3. Spring Boot 多模块Maven项目
上面的问题如何解决呢?其实还是应了那句老话:解铃还须系铃人。既然Spring Boot占用的Maven的parent配置,那么有没有不使用spring-boot-starter-parent的方法。还别说,真有。那么我们这一题的关键就破解了。那如何做呢?
3.1. 创建pom类型空白Maven项目
和1.1一样,创建空白Maven项目。创建的时候需要注意项目的packaging类型必须是pom。这个设置的意思类似与创建一个公共模块,负责配置项处理。具体的参照上1.1章节。
3.2. 没有parent使用Spring Boot
前面我们说使用Spring Boot需要引入spring-boot-starter-parent。在这里我们需要空置
parent配置。
3.3. 创建Maven Module子项目
具体的创建过程大家自行搜索研究,大体过程和创建空白Maven项目一样。唯一需要的指定工作集即父项目,就是上面提到的空白项目。这个项目将作为具体Spring Boot的承载体。
好了,现在关键来了。我们不使用spring-boot-starter-parent,那么谁来完成它的工作,怎么完成?这里就需要使用spring-data-releasetrain和
spring-boot-dependencies。这两个分别负责Spring Boot应用的默认配置以及管理必要的架包依赖。和spring-boot-starter-parent不同,这两个依赖并不会占据parent。我们可以将它们放在dependencyManagement中:
org.springframework.data spring-data-releasetrain
2020.0.0-SR1
pom
import
org.springframework.boot spring-boot-dependencies
3.4.5
pom
import
具体详细的说明我们可以参考官方文档-[
使用
Maven插件
](docs.spring.io/spring-boot…)
做完这关键的一步,剩下的就和传统Spring Boot项目一样,配置核心功能包以及spring-boot-maven-plugin打包插件即可。请参考上面,不再详细展开。
到这里Spring Boot多模块Maven项目就结束了,你可以配置更多其他项目,甚至项目里面不使用Spring Boot也可以,或者创建Spring MVC项目也可以。总之,你就可以是那个百变小郎君,玩得花。
当然Spring Boot和Maven的故事到这里还没有结束。后续有时间可以再讲讲怎么从Spring Boot项目中分离依赖的架包。那将是又一段跌宕起伏的故事了。