使用 Spring Boot 创建 Fat Jar 应用

在本指南中,我将向你展示如何使用 Spring Boot 创建 Fat Jar。我们将一起构建一个简单的 “UsersMicroservice”,然后将其打包到 Fat Jar 中。如果你是新手,也不用担心,我会一步一步地指导你,并回答你在使用过程中遇到的各种问题。

Fat JAR 是啥?

Fat JAR 通常也称为 uber-JAR,是一种 Java 归档 (JAR) 文件,它不仅包括应用程序的编译源代码,还包括运行应用程序所需的所有依赖项和资源。这些依赖项可能包括库、框架,甚至是嵌入式服务器,如 Tomcat 或 Jetty,这些通常在 Spring Boot 应用中使用。

换句话说,Fat JAR 是一个独立可直接运行的软件包。与普通 JAR 文件不同的是,普通 JAR 文件在运行应用程序时可能需要在 classpath 中存在外部依赖,而 Fat JAR 文件则完全自给自足,可以在任何已安装 Java 虚拟机(JVM)的系统上运行,无需安装或设置任何额外的依赖。

为什么使用 Fat JAR?

使用 Fat JAR 有几个好处:

  1. 简单: 由于 Fat JAR 包已经含运行应用程序所需的所有内容,因此它简化了部署过程。没有在部署环境中设置和管理外部依赖的负担。
  2. 可移植性: 你可以在任何支持 JVM 的平台上运行 fat JAR。这使得它具有极高的可移植性,非常适合各种环境,包括不同的开发、测试、暂存和生产设置。
  3. 微服务架构: Fat JAR 在微服务架构中尤其有用。在这种架构风格中,每个微服务通常都是一个独立的应用程序,可以独立开发、部署和扩展。将每个微服务打包为 Fat JAR,可以方便地分别管理和部署每个服务。
  4. 一致性: 将应用程序打包为 fat JAR 时,可以确保在构建和运行应用程序时使用同一套依赖。这有助于避免在构建和运行时使用不同版本的依赖时可能出现的问题。

尽管有这些优点,但也要注意 fat JAR 的缺点。fat JAR 可能比普通 JAR 大得多,这会减慢构建和启动速度,并占用更多资源。此外,如果同一系统中的多个 fat JAR 使用相同的依赖,这可能会导致冗余,因为每个 JAR 都包含每个依赖的副本。

创建工程

首先创建一个新的 Spring Boot 项目。可以通过 Spring Initializr 来进行创建。确保要包含必须的依赖,在此,为了简单起见,我们只使用 Spring Web。

创建应用中的类

现在,让我们创建应用中的用到的类。在本例中,我创建了一个名为 User 的 model 类和一个名为 UsersController 的 REST controller。不过,这些只是为了演示目的,与创建 fat JAR 并无直接关系。对于你来说,这些类可能会根据你应用程序的具体需求而有所不同。

Model Class:src/main/java/com/example/UsersMicroservice/model 目录下创建 User model 类。

package com.example.UsersMicroservice.model;

public class User {
    private String name;
    private String email;
    // constructor, getters, and setters
}

Controller Class: 接下来,在 src/main/java/com/example/UsersMicroservice/controller 下创建 UsersController 类。

package com.example.UsersMicroservice.controller;

import com.example.UsersMicroservice.model.User;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(path = "/users")
public class UsersController {
  
    @PostMapping
    public User create(@RequestBody User user) {
        // save the user
        return user;
    }
}

这些类只是作为示例,你需要创建的实际应用类将取决于你的具体应用需求。

Maven 依赖

在本节中,我们将介绍如何在 pom.xml 文件中设置适当的 Maven 依赖,以创建 Spring Boot RESTful 微服务应用程序,并将其打包到 Fat Jar 中。

Dependencies 部分

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

在依赖项部分,我们指定了项目运行所需的库。在本例中,我加入了 spring-boot-starter-web 依赖。

spring-boot-starter-web 是用于构建 webp 应用程序和微服务的 starter。它使用 Tomcat 作为默认的嵌入式容器。

当我们添加此依赖项时,Maven 会自动下载它并将其提供给我们的项目。它确保我们的应用程序拥有创建基于 web 的应用所需的所有模块。

Build 部分

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

构建部分是我们指定构建相关设置的地方。其中最关键的是 spring-boot-maven-plugin 插件。该插件提供了多项功能:

  1. 它会创建一个可执行的 jar 或 war 文件。这就是我们所说的 “fat jar”,因为它包含了运行应用程序所需的所有依赖项和文件。这样就能更方便地分发和部署应用程序。
  2. 它会搜索 public static void main(String[] args) 方法,将其标记为可运行类。
  3. 它提供了一个内置的依赖关系解析器,可设置版本号以匹配 Spring Boot 的依赖。因此,你可以省略依赖的版本标记。

总之,spring-boot-starter-web 是创建基于 Web 的应用程序(包括 RESTful 服务)所必需的。另一方面,spring-boot-maven-plugin 对于将应用程序及其依赖项打包成一个可执行的 “fat” jar,从而简化分发和部署过程至关重要。

用 Maven 构建 Fat Jar

接下来,为我们的应用程序创建一个 Fat Jar。

执行 mvn clean package 命令

首先,我们需要在终端运行一个特定的命令。导航到项目目录,输入以下命令: mvn clean package

这条命令有几个作用。

  • mvn clean 会清理以前编译时产生的任何工件(artifact)。之后,
  • mvn package 启动。该命令根据 pom.xml 配置将我们的项目打包–在我们的例子中,打包成一个 Fat Jar。

运行该命令后,你将在终端看到大量输出。如果这些输出看不懂也没关系,Maven 会告诉你它在每一步都做了什么。你会看到它编译代码、运行测试,然后将代码打包成 jar 文件。

输出的最后一行应该是一条成功信息,表明你的 Fat Jar 已经创建。它看起来像这样

[INFO] Building jar: /path-to-your-project/target/UsersMicroservice-1.0.0.jar

你可以在项目的 target 目录下找到 Fat Jar。根据 pom.xml 文件中的定义,该 jar 文件将以 [artifactId]-[version].jar 格式命名。

在本地执行 Fat Jar

如何运行这个 Fat Jar ?很简单。由于 Fat Jar 是一个可执行 jar,因此可以使用 java -jar 命令来运行它。导航到目标目录,运行 java -jar UsersMicroservice-1.0.0.jar

你应该可以看到 Spring Boot 应用程序启动,并且可以通过配置的端口(默认配置通常为 localhost:8080)进行访问。现在,可以对应用进行测试了。

调试 Fat Jar 构建过程

如果在创建 Fat Jar 时遇到问题,可以参考如下步骤进行调试:

  1. 检查 pom.xml 文件: 确保包含并正确配置了所有必要的依赖项和插件。
  2. 查看 Maven 输出: 如果有问题,Maven 通常会在输出中告诉你。检查是否有错误信息。
  3. 使用 Debug 选项运行: 你可以使用 -X 选项(即 mvn -X clean package)运行 Maven,以获得更详细的输出,这有助于发现任何问题。
  4. 求助社区: 有一个庞大的 Spring Boot 开发者社区。如果你遇到问题,可以考虑在 StackOverflow / Github / 中文社区 等平台上寻求帮助。

如何在 Fat Jar 中排除或包含依赖项

为什么要包含或排除某些依赖项?有时候,你可能想排除运行环境已经提供的某个依赖项,或者你可能想避免版本冲突。另一方面,确保包含必要的依赖关系对于应用程序的正确运行至关重要。

包含依赖

依赖的包含是自动发生的,你不需要做任何特殊的操作来包含依赖项。只要你在 pom.xml 文件中正确指定了依赖,Spring Boot 的 Maven 插件就会完成剩下的工作。

排除依赖

在某些情况下,你可能希望从 Fat Jar 中排除特定的依赖。例如,你可能想排除某个库,因为你的应用运行环境已经提供了该库。

要排除依赖,可以在 pom.xml 文件中进行配置。下面是一个示例:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

在本例中,spring-boot-starter-tomcat 依赖被从 spring-boot-starter-web 依赖之中排除掉了。如果你的应用打算在外部 Tomcat 的环境中运行,这将非常有用。

打包时被排除掉的依赖项,一定要确定在运行环境中存在,不然可能无法正常运行。

总结

至此,你已学会了用 Maven 通过 Spring Boot 构建了 Fat Jar 应用!这是创建可发布和可部署 Spring Boot 应用的关键技能。

以下是本教程的主要内容:

  • Maven 项目 设置: 首先,你要使用 Maven 作为构建工具,建立一个 Spring Boot 项目。
  • 创建 Fat Jar: spring-boot-maven 插件,是创建 Fat jar 的核心。当你执行 mvn clean package 命令时,Maven 会清除之前的所有构建,然后编译、测试并将你的项目打包成一个独立的可执行 jar。
  • 运行 Fat Jar: 你看到了使用 java -jar 命令运行应用程序是多么简单。这证实了 Fat Jar 是一个自包含的软件包,其中包含应用程序所需的全部代码和依赖项。
  • 包含或排除依赖: 你还学会了如何从 fat jar Spring Boot 应用程序中包含或排除依赖关系。

参考:https://www.appsdeveloperblog.com/creating-a-fat-jar-app-with-spring-boot/