面试题:Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

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. 总结

特性普通 JARSpring Boot 可执行 JAR
依赖打包不包含依赖,需要单独配置类路径包含所有依赖(Fat JAR)
运行方式需要手动指定类路径和主类直接通过 java -jar 运行
内嵌服务器包含内嵌服务器(如 Tomcat)
用途作为库文件或需要手动配置的可运行程序直接部署和运行的独立应用程序

Spring Boot 的可执行 JAR 文件极大地简化了应用程序的打包和部署过程,特别适合微服务和云原生场景。在面试中,你可以结合具体场景和实际经验,深入解释这两种 JAR 文件的区别和优势。

THE END
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容