父模块POM是否包含SpringBoot打包插件
一、场景
一个基于SpringBoot的Maven父子模块的项目(一个父项目中包含多个子项目),父模块 POM文件中,是否应该包含打包需要的插件(spring-boot-maven-plugin)?
假设项目中的子模块,有些是应用服务,有些是自定义Starter。
二、结论
对于同时包含应用服务子模块、公共库模块和自定义starter模块的项目,不应该在父POM文件中,配置spring-boot-maven-plugin,只在需要执行Spring Boot的应用服务模块中使用它。
三、spring-boot-maven-plugin 插件配置
spring-boot-maven-plugin 插件,在POM中的配置代码:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
PS:<configuration>
的配置,并不是必须的。本处是打包时排除Lombok,也就是打包应用时,不会将 Lombok 的 jar 文件包含在最终的应用程序中。Lombok 是用来生成源代码(编译时使用的),在运行时不需要包含它。
四、分析
父POM中包含spring-boot-maven-plugin
的可能理由
- 减少重复配置:将
spring-boot-maven-plugin
的配置放在父POM中可以避免在每个子模块中重复相同的配置,使得维护更容易。 - 统一版本控制:如果所有子模块都使用相同的插件版本,那么在父POM中指定插件版本可以确保一致性。
- 简化子模块POM:子模块的POM文件会更简洁,因为它们不需要显式地声明插件配置。
但是,需要注意的是,并非所有的子模块都需要使用spring-boot-maven-plugin
。例如,如果你有一些子模块是库或starter,而不是可执行的应用服务,那么它们可能不需要打包成可执行的jar或者war包,因此不需要spring-boot-maven-plugin
。
对于自定义Starter
对于自定义的starter模块,通常它们并不需要spring-boot-maven-plugin
来进行构建,因为它们只是提供依赖管理和自动配置功能。因此,在这些模块中不应该引入这个插件。
总结
- 如果你的父POM仅包含了多个应用服务子模块(不包含公共库模块和自定义starter模块),并且这些服务需要一致的构建流程,那么在父POM中配置
spring-boot-maven-plugin
是一个好的实践。 - 对于自定义starter或其他库模块,不应在这些子模块中使用
spring-boot-maven-plugin
。 - 对于同时包含应用服务子模块、公共库模块和自定义starter模块的项目,不应该在父POM文件中,配置
spring-boot-maven-plugin
,只在需要执行Spring Boot特定任务的应用服务模块中使用它。