在之前的章节中,我们已经学习了关于 Maven 的大部分知识。从本节开始,我们会通过开发一个小型项目来更好的理解之前的概念。在这一节中,我们首先要做的就是用 Maven 来构建一个包含多个模块的项目。

1. Project 和 Module

提到多模块项目构建,我们首先要弄明白 project 和 module 这两个概念。
a. 相同点:

  • project 和 module 都是 Maven 工程,有属于自己的 pom.xml。

b. 不同点:

  • module 工程必须要有父项目,一般情况下,project 工程在多模块项目中都是作为父项目存在的;
  • project 工程可以放到类似 tomcat 的容器中运行,而 module 工程则不能;

简单总结一下,project 工程包含的范围更广,单模块项目中作为项目整体,多模块项目中作为父模块存在。module 工程在多模块项目中作为子工程存在。

2. 开始创建项目

2.1 创建 project 工程

这里,我们结合市面上比较常用的开发工具 idea 来进行演示,当然,其他的开发工具也能够得到相同的效果。
刚刚,我们也了解到多模块项目必须要有 project 工程作为父项目存在,那么首先,我们就需要创建一个 project 工程。
Maven 多模块构建 - 图1
打开 idea,选择 File -> New -> Project,在弹出的窗口左侧选择 Maven 并点击 Next 按钮。
Maven 多模块构建 - 图2
在这里,需要填写 project 的信息,包括 groupId,artifactId,version 信息,并点击 Next 按钮。
Maven 多模块构建 - 图3
最后一步,只需要填写项目名称,然后点击Finish按钮即可。
Maven 多模块构建 - 图4
由于是父项目,所以并不需要代码,因此可以将 src 目录直接删掉。
Maven 多模块构建 - 图5
至此,project 项目创建完成。

2.2 创建 module 工程

在创建好父工程之后,我们开始创建 module 工程。在父工程上点击右键,选择New -> Module。
Maven 多模块构建 - 图6
我们会发现跟刚刚创建 project 工程的步骤是一样的,只不过其中有些已经不需要我们来填写了,例如 groupId,version 等,这里是因为存在父工程,而子工程的这些元素节点都是继承父工程的。所以我们只需要填写子工程的 artifactId 即可。
这里我们分别创建 mall-account 工程,mall-commodity 工程,mall-order 工程,mall-delivery 工程,分别对应商城系统的用户模块,商品模块,订单模块以及物流模块。
另外我们在单独创建一个 mall-web 工程,主要的功能是作为各个模块的整合并与前端页面进行对接。
在创建 mall-web 工程的时候,需要注意的是,我们要选择一个maven-archetype-webapp的模块。然后点击 Next 按钮,进入下一步。
Maven 多模块构建 - 图7
后续操作和其他模块没有太大区别,按照实际情况选择和填写即可。
现在,整个项目已经初具雏形了,我们来看一下现在项目的结构。
Maven 多模块构建 - 图8

2.3 添加依赖

注意:mall 项目为一个实例项目,中间可能会存在某些不太合理的地方,我们这里更多的关注项目构建过程。

  1. mall-account 项目为用户项目,需要被 mall-order 项目、mall-delivery 项目和 mall-web 项目依赖;
  2. mall-order 项目为订单项目,需要被 mall-delivery 项目和 mall-web 项目依赖;
  3. mall-commodity 项目为商品项目,需要被 mall-web 模块依赖;
  4. mall-delivery 项目为物流项目,需要被 mall-web 项目依赖。

我们首先在父工程 mall-aggregate 的 pom.xml 文件中,添加 dependencyManagement 节点元素。

  1. <properties>
  2. <junit.version>4.11</junit.version>
  3. </properties>
  4. <dependencyManagement>
  5. <dependencies>
  6. <dependency>
  7. <groupId>com.mic.tech</groupId>
  8. <artifactId>mall-account</artifactId>
  9. <version>${project.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.mic.tech</groupId>
  13. <artifactId>mall-commodity</artifactId>
  14. <version>${project.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.mic.tech</groupId>
  18. <artifactId>mall-order</artifactId>
  19. <version>${project.version}</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.mic.tech</groupId>
  23. <artifactId>mall-delivery</artifactId>
  24. <version>${project.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>junit</groupId>
  28. <artifactId>junit</artifactId>
  29. <version>${junit.version}</version>
  30. <scope>test</scope>
  31. </dependency>
  32. </dependencies>
  33. </dependencyManagement>

然后,依次在各个子工程中,根据子项目之间的依赖关系,添加对应的依赖。在添加完依赖之后,我们可以使用之前安装过的 Maven Helper 插件来生成整个工程的依赖关系图。
Maven 多模块构建 - 图9
生成之后的依赖关系图如下:
Maven 多模块构建 - 图10
从这个图中,我们可以清楚看到目前 mall 工程各个模块直接的依赖关系。在实际的开发过程中,可以根据生成的依赖关系图来判断是否存在某些没必要引入的依赖,进行依赖优化。

2.4 运行这个项目

在项目创建好之后,我们就来运行这个项目。在 idea 中点击Add Configuration按钮。
Maven 多模块构建 - 图11
在弹出的界面点击小+号,然后选择 Tomcat Server -> Local。
Maven 多模块构建 - 图12
在 Tomcat Server 界面的 Deployment 页签,点击小+号,选择Artifact… ,并在弹出的窗口中,选择mallweb:war exploded,并在Application context中输入/index ,最后点击OK按钮。
Maven 多模块构建 - 图13
点击Add Configuration 旁边的三角形按钮,启动项目,项目启动后控制台会输出如下日志产生。
Maven 多模块构建 - 图14
项目启动成功后,我们在浏览器中输入地址http://localhost:8080/index/,可以看到项目的欢迎页面。
Maven 多模块构建 - 图15
至此,我们的项目已经创建并启动完成。

3. 构建这个项目

有了之前章节的铺垫,项目构建就变得非常容易了。
我们将目录切换到 mall-aggregate 目录下,执行 mvn clean install 命令,就可以得到如下执行结果。

  1. [INFO] Scanning for projects...
  2. [WARNING]
  3. [WARNING] Some problems were encountered while building the effective model for com.mic.tech:mall-web:war:1.0.0-SNAPSHOT
  4. [WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: junit:junit:jar -> duplicate declaration of version (?) @ line 46, column 17
  5. [WARNING]
  6. [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
  7. [WARNING]
  8. [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
  9. [WARNING]
  10. [INFO] ------------------------------------------------------------------------
  11. [INFO] Reactor Build Order:
  12. [INFO]
  13. [INFO] mall-aggregate [pom]
  14. [INFO] mall-account [jar]
  15. [INFO] mall-commodity [jar]
  16. [INFO] mall-order [jar]
  17. [INFO] mall-delivery [jar]
  18. [INFO] mall-web Maven Webapp [war]
  19. [INFO]
  20. [INFO] --------------------< com.mic.tech:mall-aggregate >---------------------
  21. [INFO] Building mall-aggregate 1.0.0-SNAPSHOT [1/6]
  22. [INFO] --------------------------------[ pom ]---------------------------------
  23. [INFO] ...
  24. [INFO] ---------------------< com.mic.tech:mall-account >----------------------
  25. [INFO] Building mall-account 1.0.0-SNAPSHOT [2/6]
  26. [INFO] --------------------------------[ jar ]---------------------------------
  27. [INFO] ...
  28. [INFO] --------------------< com.mic.tech:mall-commodity >---------------------
  29. [INFO] Building mall-commodity 1.0.0-SNAPSHOT [3/6]
  30. [INFO] --------------------------------[ jar ]---------------------------------
  31. [INFO] ...
  32. [INFO] ----------------------< com.mic.tech:mall-order >-----------------------
  33. [INFO] Building mall-order 1.0.0-SNAPSHOT [4/6]
  34. [INFO] --------------------------------[ jar ]---------------------------------
  35. [INFO] ...
  36. [INFO] ---------------------< com.mic.tech:mall-delivery >---------------------
  37. [INFO] Building mall-delivery 1.0.0-SNAPSHOT [5/6]
  38. [INFO] --------------------------------[ jar ]---------------------------------
  39. [INFO] ...
  40. [INFO] -----------------------< com.mic.tech:mall-web >------------------------
  41. [INFO] Building mall-web Maven Webapp 1.0.0-SNAPSHOT [6/6]
  42. [INFO] --------------------------------[ war ]---------------------------------
  43. [INFO] ...
  44. [INFO] Building war: D:\code\mall-aggregate\mall-web\target\mall-web.war
  45. [INFO] ------------------------------------------------------------------------
  46. [INFO] Reactor Summary for mall-aggregate 1.0.0-SNAPSHOT:
  47. [INFO]
  48. [INFO] mall-aggregate ..................................... SUCCESS [ 0.897 s]
  49. [INFO] mall-account ....................................... SUCCESS [ 2.173 s]
  50. [INFO] mall-commodity ..................................... SUCCESS [ 0.191 s]
  51. [INFO] mall-order ......................................... SUCCESS [ 0.192 s]
  52. [INFO] mall-delivery ...................................... SUCCESS [ 0.148 s]
  53. [INFO] mall-web Maven Webapp .............................. SUCCESS [ 3.331 s]
  54. [INFO] ------------------------------------------------------------------------
  55. [INFO] BUILD SUCCESS
  56. [INFO] ------------------------------------------------------------------------
  57. [INFO] Total time: 7.154 s
  58. [INFO] Finished at: 2020-05-09T22:55:42+08:00
  59. [INFO] ------------------------------------------------------------------------

4. 小结

在本章节中,我们完成了 mall 工程的搭建,运行,构建的整个过程,本节中并没有太多新的内容,都是基于之前章节的内容,进行整合,后续的章节也会使用这个示例项目来进行讲解。