父模块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特定任务的应用服务模块中使用它。



















