Spring Boot 打成的 可执行 JAR 和普通的 JAR 文件在结构和用途上有显著的区别。以下是它们的详细对比:
1. 普通 JAR 文件
普通 JAR 文件是标准的 Java 归档文件,通常用于打包类文件、资源文件和库文件。它的特点包括:
- 结构:
- 包含编译后的
.class
文件。 - 可能包含资源文件(如配置文件、图片等)。
- 不包含依赖的第三方库(依赖需要单独配置)。
- 包含编译后的
- 运行方式:
- 需要手动指定类路径(
-cp
或-classpath
)和主类(Main-Class
)。 - 依赖的第三方库需要单独添加到类路径中。
- 需要手动指定类路径(
- 用途:
- 通常作为库文件(Library JAR)供其他项目使用。
- 也可以作为可运行的程序,但需要手动配置类路径和主类。
示例:运行普通 JAR
java -cp myapp.jar:lib/* com.example.MyMainClass
2. Spring Boot 可执行 JAR 文件
Spring Boot 的可执行 JAR 文件是一种特殊的 JAR 文件,它包含了应用程序的所有依赖和一个内嵌的服务器(如 Tomcat),可以直接运行。它的特点包括:
- 结构:
- 采用 Fat JAR 或 Uber JAR 的形式,包含所有依赖的第三方库。
- 使用 嵌套 JAR 结构,将依赖库打包在
BOOT-INF/lib
目录下。 - 应用程序的类文件放在
BOOT-INF/classes
目录下。 - 包含 Spring Boot 的启动加载器(
org.springframework.boot.loader
),用于引导应用程序。
- 运行方式:
- 可以直接通过
java -jar
命令运行,无需额外配置类路径。 - 内嵌了服务器(如 Tomcat),无需外部 Web 服务器。
- 可以直接通过
- 用途:
- 主要用于部署和运行 Spring Boot 应用程序。
- 适合微服务架构和云原生应用。
示例:运行 Spring Boot JAR
java -jar myapp.jar
3. Spring Boot JAR 的内部结构
Spring Boot 可执行 JAR 的内部结构如下:
myapp.jar
├── META-INF
│ ├── MANIFEST.MF # 包含 Main-Class 和 Start-Class
├── BOOT-INF
│ ├── classes # 应用程序的类文件
│ └── lib # 所有依赖的第三方库
└── org
└── springframework
└── boot
└── loader # Spring Boot 的启动加载器
3.1 MANIFEST.MF
文件
MANIFEST.MF
文件中定义了 Main-Class
和 Start-Class
:
Main-Class
:指向 Spring Boot 的启动加载器(org.springframework.boot.loader.JarLauncher
)。Start-Class
:指向应用程序的主类(com.example.MyApplication
)。
3.2 嵌套 JAR 结构
Spring Boot 使用嵌套 JAR 结构来打包依赖库,这种结构使得 JAR 文件可以直接运行,而无需解压或单独配置类路径。
4. Spring Boot JAR 的优点
- 简化部署:所有依赖和内嵌服务器都打包在一个 JAR 文件中,部署非常简单。
- 独立运行:无需外部 Web 服务器,可以直接通过
java -jar
运行。 - 适合云原生:与 Docker 和 Kubernetes 等云原生技术完美结合。
- 易于构建:通过 Spring Boot Maven/Gradle 插件一键打包。
5. 如何构建 Spring Boot 可执行 JAR
Spring Boot 提供了 Maven 和 Gradle 插件来构建可执行 JAR。
5.1 使用 Maven
在 pom.xml
中配置 Spring Boot Maven 插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
运行以下命令打包:
mvn clean package
5.2 使用 Gradle
在 build.gradle
中配置 Spring Boot Gradle 插件:
plugins {
id 'org.springframework.boot' version '3.x.x'
id 'io.spring.dependency-management' version '1.x.x'
id 'java'
}
运行以下命令打包:
gradle bootJar
6. 总结
特性 | 普通 JAR | Spring Boot 可执行 JAR |
---|---|---|
依赖打包 | 不包含依赖,需要单独配置类路径 | 包含所有依赖(Fat JAR) |
运行方式 | 需要手动指定类路径和主类 | 直接通过 java -jar 运行 |
内嵌服务器 | 无 | 包含内嵌服务器(如 Tomcat) |
用途 | 作为库文件或需要手动配置的可运行程序 | 直接部署和运行的独立应用程序 |
Spring Boot 的可执行 JAR 文件极大地简化了应用程序的打包和部署过程,特别适合微服务和云原生场景。在面试中,你可以结合具体场景和实际经验,深入解释这两种 JAR 文件的区别和优势。
THE END
暂无评论内容