1. 概述
在本教程中,我们将学习如何将一个 Spring Boot 应用程序作为依赖引入到其他项目中使用。
2. Spring Boot 打包机制
Spring Boot 的 Maven 和 Gradle 插件默认会将我们的应用打包为可执行的 JAR 文件。这种 JAR 文件有一个特点:所有的类文件都位于 BOOT-INF/classes
目录下,这意味着这类 JAR ❌不能直接作为依赖使用,因为其他项目无法正确读取其中的类。
这不是一个 Bug,而是 Spring Boot 的设计特性之一。如果你希望共享某些类给其他项目,推荐做法是:
✅ 将这些类抽离到一个独立的模块中,并打包为普通 JAR,然后作为依赖引入到多个项目中。
但如果由于项目结构限制无法拆分模块,我们也可以通过配置插件来生成一个可用于依赖的 JAR。
2.1 Maven 配置示例
我们可以为 Spring Boot Maven 插件添加一个 classifier
配置项,让插件生成两个 JAR:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
⚠️ 注意:如果你使用的是 Spring Boot 1.x,插件配置方式略有不同:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
这样配置后,构建过程会生成两个 JAR:
- 一个可执行 JAR(带有
exec
后缀) - 一个普通 JAR(可用于作为依赖)
3. 使用 Maven Assembly Plugin 打包
如果你希望打包出一个包含所有依赖的“胖包”,可以使用 maven-assembly-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
如果你同时配置了 spring-boot-maven-plugin
的 exec
classifier,那么构建结果将包含:
- 可执行 JAR(
-exec.jar
) - 普通类 JAR(无 classifier)
- 带有依赖的完整 JAR(
-jar-with-dependencies.jar
)
这个“胖包”可以直接作为依赖引入,无需额外引入 Spring Boot 的依赖库。
4. 总结
本文介绍了两种方式将 Spring Boot 应用打包为可用作依赖的 JAR 文件:
方式 | 说明 |
---|---|
✅ 推荐方式 | 抽离公共类到独立模块并打包为普通 JAR |
⚠️ 替代方案 | 使用 spring-boot-maven-plugin 配置 classifier 生成普通 JAR |
⚠️ 胖包方案 | 使用 maven-assembly-plugin 打包带依赖的完整 JAR |
完整示例代码已托管在 GitHub:spring-boot-crud