所谓的聚合工程,实际上也就是多模块项目。在一个比较大的互联网项目中,项目需要拆分成多个模块进行开发,比如订单模块、VIP 模块、支付模块、内容管理模块、CMS、CRM 等等。这种拆分方式,实际上更接近于微服务的思想。在一个模块中,还可以继续进行拆分,例如分成 dao、service、controller 等。

有人可能会说,这个分包不就行了吗?

小项目当然可以分包,大项目就没法分包了。比如,在一个大的电商系统中,有一个子模块叫做用户管理、还有一个子模块叫做订单管理,这两个子模块都涉及到用户,像这种情况,我们就需要将用户类单独提取出来,做成单独的模块,供其他模块调用。

# 8.1 多模块项目展示

|--javaboy-parent
      |-- javaboy-cms
      |-- javaboy-crm
      |-- javaboy-manger
           |-- javaboy-manager-model
           |-- javaboy-manager-dao
           |-- javaboy-manager-service
           |-- javaboy-manager-web

以 javaboy-manger 为例,javaboy-manager 本身并不提供功能,它只负责管理他自己的子模块,而他的子模块每一个都无法独立运行,需要四个结合在一起,才可以运行。项目打包时,model、dao、service 都将打包成 jar,然后会自动将打包好的 jar 复制到 web 中,再自动将 web 打包成 war 包。

# 8.2 IDEA 中创建聚合工程

1.创建一个空的 Maven 项目:

项目创建完成后,由于 parent 并不参与业务的实现,只是用来管理它的子模块,因此,src 目录可以将其删除。

2.选中当前工程,右键单击,New->Module

然后继续选择创建一个 Maven 项目:

在 IDEA 中,已经默认指明了当前 Module 的 parent,开发者只需要填入当前 Module 的 artifactId 即可:

javaboy-manager 创建完成后,此时,观察 javaboy-parent 的 pom.xml 文件,发现它自动加上了 packing 属性:

其中,它的 packaging 属性值为 pom,这表示它是一个聚合工程,同时,他还多了 modules 节点,指明了它自己的子模块。 同时,注意 javaboy-manager ,它自身多了一个 parent 节点,这个 parent 节点描述了它的父模块的属性值:

<parent>
    <artifactId>javaboy-parent</artifactId>
    <groupId>org.javaboy</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

这个 parent 不仅仅是一个简单的父子关系描述,它存在继承关系,一般我们可以在 parent 中统一定义依赖或者插件的版本号

3.由于 javaboy-manager 本身也是一个聚合工程,因此,javaboy-manager 的 src 目录也可以删除。

4.选中 javaboy-manager,右键单击,New->Module 创建一个新的 Maven 模块出来。这个步骤类似于第二步,不在赘述。 这里,新的 javaboy-manager-model 创建成功后,我们手动配置它的 packaging 属性值为 jar。

5.依照第 4 步,再分别创建 javaboy-manager-service 以及 javaboy-manager-dao 6.继续创建 javaboy-manager-web 模块,不同于其他模块,web 模块需要打包成 war。web 模块创建可以参考【第五篇文章】。 7.web 工程创建完成后,完善模块之间的继承关系。

javaboy-manager-web 依赖 javaboy-manager-service javaboy-manager-service 依赖 javaboy-manager-dao javaboy-manager-dao 依赖 javaboy-manager-model

注意,依赖默认是有传递性的,即在 javaboy-manager-dao 中依赖了 javaboy-manager-model,在 javaboy-manager-service 也能访问到。

配置后的依赖关系如下图:

接下来就可以在不同的模块中写代码,然后进行项目部署了。部署方式参考【第五篇文章】

有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:

  1. 不可以直接单独打包
  2. 如果要打包,有两种方式:
  • 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
  • 从聚合工程处打包,即从 web 的parent 处打包。