一、插件介绍
spring-boot-maven-plugin
是一个用于简化 Spring Boot 应用程序构建过程的 Maven 插件。它提供了许多方便的功能来帮助开发者快速构建可执行的 JAR 或 WAR 文件,运行应用程序,以及执行 Spring Boot 特定的任务。
插件在pom中的配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
插件还可以进一步配置,比如在构建过程中排除某些依赖(比如lombok):
<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>
二、自定义Starter不要使用spring-boot-maven-plugin
1. 场景
在SpringBoot自定义Starter时,spring-boot-maven-plugin
打出来的 jar 包,被目标SpringBoot项目通过 maven 坐标依赖后,目标项目会报错,找不到Starter中的包(import
直接报错)。
2. 解决方法
把这个插件删掉,再去打包,maven install 是正常的;目标项目通过 maven 坐标添加依赖后,也能够正常导入(import)和运行。
将这个插件删除后,开发期间的运行调试也是正常的。此时,打出来的jar包,不再是可执行的jar包了,内部结构和SpringBoot的jar包结构是不同的。
3. 原理分析
SpringBoot 自定义Starter,为什么不能用 spring-boot-maven-plugin 打包?
在Spring Boot中创建自定义Starter时,通常不会使用spring-boot-maven-plugin
进行打包。这是因为Starter本质上是一个库项目,是一个包含自动配置类和依赖管理的jar包。当你创建一个Starter并希望它能够被其他Spring Boot项目所使用时,你需要确保它只包含自动配置和必要的依赖,而不是一个可执行的Spring Boot应用。
自定义Starter通常不使用 spring-boot-maven-plugin
进行打包,详细原因如下:
-
依赖范围:自定义Starter通常只包含配置和代码,而不包含应用的业务逻辑。因此,它们不需要被打包成可执行的JAR文件,而是作为依赖被其他项目引用。
-
打包目的:
spring-boot-maven-plugin
主要用于打包完整的Spring Boot应用程序,包括应用的类和依赖库。而自定义Starter的目的是提供配置和自动配置类,它们应该被打包成普通的JAR文件,而不是包含所有依赖的可执行JAR。 -
部署方式:自定义Starter的使用者可能希望保持对依赖库版本的控制,而不是依赖Starter中的版本。因此,它们通常不会被打包成包含所有依赖的单一JAR文件。
总结来说,自定义Starter的目的是提供通用配置和代码,而不是创建一个完整的可执行应用程序。因此,它们通常使用标准的Maven打包插件来打包,而不是使用 spring-boot-maven-plugin
。
三、JAR包结构对比
1. Maven默认JAR包结构
2. SpringBoot应用JAR包结构
使用 spring-boot-maven-plugin
打的JAR包,结构如下:
该JAR包,是可以通过 java -jar
命令直接运行的。
JAR包里面包含了运行需要的依赖的 jar 包。示例如下:
四、maven-compiler-plugin(插件覆盖)
有一种情况,在父子模块项目中,父项目的POM文件中配置了spring-boot-maven-plugin
,导致子模块作为公共模块或者自定义Starter,无法打包。
此时,可以在子模块POM中配置Maven打包插件,来覆盖掉父模块的插件配置。
在SpringBoot3.3.3
环境下,经过测试,打包正常的插件及版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
</plugin>
</plugins>
</build>