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-pluginexec classifier,那么构建结果将包含:

  1. 可执行 JAR(-exec.jar
  2. 普通类 JAR(无 classifier)
  3. 带有依赖的完整 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


原始标题:Using a Spring Boot Application as a Dependency