1. 配置继承 vs 代码复用
-
父项目:
-
配置继承:子模块通过继承父项目的配置,减少冗余代码。例如,父工程定义
<java.version>17</java.version>
,子模块直接使用。 -
非代码传递:父项目本身不会被打包或作为依赖传递到子模块中。
-
-
依赖:
-
代码复用:依赖的代码会被打包到模块中(如 JAR 文件),直接影响最终构建产物。
-
显式声明:每个模块需独立声明依赖及其版本,无继承关系。
-
2. 维护成本
-
父项目:
-
集中管理:版本升级或配置变更只需修改父工程,所有子模块自动生效。
-
一致性:避免多模块因配置差异导致构建失败或行为不一致。
-
-
直接依赖:
-
重复配置:每个模块需单独声明依赖版本,版本冲突风险高(如模块 A 用 Spring 5,模块 B 用 Spring 6)。
-
维护困难:升级依赖版本时需逐个修改所有模块,易遗漏或出错。
-
3. 典型场景
-
父项目适用场景:
-
多模块项目中需要统一技术栈(如 Spring Boot 版本、JDK 版本)。
-
企业级项目要求所有子模块遵循相同的构建规范。
-
-
直接依赖适用场景:
-
单模块项目或简单应用。
-
需要引入第三方库或工具(如 Guava、Jackson)
-
总结:
作为父项目和作为依赖的区别 继承父工程的优势 - 依赖管理:可以在父工程中定义依赖的版本,子模块可以直接引用而不必指定版本号。 - 插件管理:可以在父工程中配置常用的插件及其版本,子模块可以直接使用这些配置。 - 属性设置:可以在父工程中定义一些通用的属性,如项目编码、Java 版本等。 - 统一配置:可以统一多个子模块的构建配置,确保一致性。 直接引入依赖的局限性(如果你不使用继承父工程的方式,而是通过直接引入依赖的方式来管理项目,那么你将失去上述的一些优势) - 依赖版本管理:每个子模块都需要单独指定依赖的版本,这会导致大量的重复配置,并且难以维护。 - 插件配置:每个子模块都需要单独配置插件及其版本,无法共享父工程中的插件配置。 - 属性设置:每个子模块都需要单独设置通用的属性,如项目编码、Java 版本等。 - 构建配置:每个子模块的构建配置需要单独维护,难以保证一致性。