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 Archive | Plain Archive |
---|---|---|
是否包含依赖 | 是(全部打包进 JAR) | 否(只包含自身代码) |
是否可直接运行 | 是(java -jar ) | 否(需手动配置 classpath) |
典型用途 | 部署、独立运行、容器化 | 作为依赖、集成到其他系统 |
结构 | 有 BOOT-INF/lib 、BOOT-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 Archive | bootJar | 是 | 是 | myapp.jar |
Plain Archive | jar | 否 | 否 | myapp-plain.jar |