模块管理

在软件开发中,把一个大项目分拆为多个模块是降低软件复杂度的有效方法:

  1. ┌─────────┐
  2. Module A
  3. └─────────┘
  4. ┌──────────────┐ split ┌─────────┐
  5. Single Project│───────> Module B
  6. └──────────────┘ └─────────┘
  7. ┌─────────┐
  8. Module C
  9. └─────────┘

对于Maven工程来说,原来是一个大项目:

  1. single-project
  2. ├── pom.xml
  3. └── src

现在可以分拆成3个模块:

  1. single-project
  2. ├── module-a
  3. ├── pom.xml
  4. └── src
  5. ├── module-b
  6. ├── pom.xml
  7. └── src
  8. └── module-c
  9. ├── pom.xml
  10. └── src

Maven可以有效地管理多个模块,我们只需要把每个模块当作一个独立的Maven项目,它们有各自独立的pom.xml。例如,模块A的pom.xml:

模块B的pom.xml:

可以看出来,模块A和模块B的pom.xml高度相似,因此,我们可以提取出共同部分作为parent:

注意到parent的packaging是pom而不是jar,因为parent本身不含任何java代码。编写parent的pom.xml只是为了在各个模块中减少重复的配置。现在我们的整个工程结构如下:

  1. single-project
  2. ├── parent
  3. └── pom.xml
  4. ├── module-a
  5. ├── pom.xml
  6. └── src
  7. ├── module-b
  8. ├── pom.xml
  9. └── src
  10. └── module-c
  11. ├── pom.xml
  12. └── src

如果模块A依赖模块B,则模块A需要模块B的jar包才能正常编译:

中央仓库

其实我们使用的大多数第三方模块都是这个用法,例如,我们使用commons logging、log4j这些第三方模块,就是第三方模块的开发者自己把编译好的jar包发布到maven的中央仓库中。

私有仓库

本地仓库

但是我们不推荐把自己的模块安装到maven的本地仓库,因为每次修改模块b的源码,都需要重新安装,容易出现版本不一致的情况

推荐的做法是模块化编译,在编译的时候,告诉maven几个模块之间存在依赖关系,需要一块编译,maven就会自动按依赖顺序编译这些模块

  1. <modules>
  2. <module>模块A</module>
  3. <module>模块B</module>
  4. <module>模块C</module>
  5. </modules>

Maven支持模块化管理,可以把一个大项目拆成几个模块可以通过继承在parent的pom.xml统一定义重复配置可以通过<modules>编译多个模块

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

模块管理 - 图1模块管理 - 图2