SpringBoot 的 executable archive 和 plain archive

3 阅读3分钟

1. 什么是 Spring Boot 的 Archive?

Spring Boot 项目在打包时,可以生成两种主要的归档包(archive):executable archive 和 plain archive
它们本质上都是 JAR(或 WAR)文件,但用途和结构略有不同。


2. Executable Archive(可执行归档)

定义

  • Executable archive 是指可以直接通过 java -jar 命令运行的 JAR 文件。
  • 这种 JAR 文件内置了 Spring Boot 的启动器(Bootstrapper),以及所有依赖(包括第三方库)。

特点

  • 自包含:所有依赖都被打包进 JAR 文件(通常在 BOOT-INF/lib 目录下)。
  • 可直接运行:无需解压或配置环境,直接用 java -jar xxx.jar 启动。
  • 入口类:包含 Main-Class 和 Start-Class 的 MANIFEST.MF,指定了应用的启动入口。
  • 适合部署:非常适合云原生、容器化、自动化部署等场景。

结构示例

myapp.jar
├── BOOT-INF/
│   ├── classes/         # 应用的 class 文件
│   └── lib/             # 所有依赖的 jar 包
├── META-INF/
│   └── MANIFEST.MF      # 包含 Main-Class 和 Start-Class
└── org/
    └── springframework/ # Spring Boot 启动相关代码

如何生成

  • Maven 插件默认生成 executable JAR:
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
  • 生成后直接运行:
java -jar target/myapp.jar

3. Plain Archive(普通归档)

定义

  • Plain archive 是指一个普通的 JAR 文件,仅包含项目自身的 class 文件,不包含依赖库。
  • 这种 JAR 文件不能直接用 java -jar 运行(除非你自己处理依赖)。

特点

  • 不包含依赖:只包含项目自己的代码和资源。
  • 不能直接运行:需要手动配置 classpath 或用外部工具运行。
  • 适合集成:适合作为依赖被其他项目引用,或在已有的应用服务器环境下运行。

结构示例

myapp.jar
├── com/
│   └── example/         # 应用的 class 文件
├── META-INF/
│   └── MANIFEST.MF      # 没有 Spring Boot 的启动信息
└── ...                  # 没有依赖 jar 包

如何生成

  • Maven 插件配置生成 plain JAR:
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <classifier>plain</classifier>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  • 生成的文件名通常为 myapp-plain.jar

4. 主要区别总结

特性Executable ArchivePlain Archive
是否包含依赖是(全部打包进 JAR)否(只包含自身代码)
是否可直接运行是(java -jar否(需手动配置 classpath)
典型用途部署、独立运行、容器化作为依赖、集成到其他系统
结构有 BOOT-INF/libBOOT-INF/classes只有 class 文件和资源

5. 什么时候用哪种?

  • 部署到服务器、云、容器:用 executable archive,方便直接运行和自动化部署。
  • 作为依赖给其他项目用:用 plain archive,避免重复打包依赖。
  • 需要自定义启动方式或特殊集成:可选择 plain archive。

Gradle 构建 executable archive 和 plain archive

在 Spring Boot 项目中,使用 Gradle 构建时,executable archive 和 plain archive 分别对应不同的 Gradle 任务(task):


1. Executable Archive

定义

  • 由 Spring Boot 插件的 bootJar 任务生成。
  • 生成的 JAR 包含所有依赖和 Spring Boot 启动器,可以直接用 java -jar 运行。

用法

./gradlew bootJar

生成的文件

  • build/libs/your-app-name.jar(可直接运行)

build.gradle 配置示例

plugins {
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

bootJar {
    archiveFileName = 'myapp.jar'
}

2. Plain Archive

定义

  • 由 Gradle 的标准 jar 任务生成。
  • 只包含项目自身的 class 文件和资源,不包含依赖,不能直接用 java -jar 运行。

用法

./gradlew jar

生成的文件

  • build/libs/your-app-name-plain.jar(或 your-app-name.jar,取决于配置)

build.gradle 配置示例

jar {
    archiveClassifier = 'plain' // 生成 myapp-plain.jar
}

3. 总结对比

类型Gradle 任务是否包含依赖是否可直接运行典型文件名
Executable ArchivebootJarmyapp.jar
Plain Archivejarmyapp-plain.jar