1. 引言

近年来,一个令人欣慰的发展趋势是,Web应用的部署方式正在不断简化。跳过中间繁琐的历史步骤,我们来到了今天——不再需要复杂的Servlet和XML模板,甚至可以抛弃大部分服务器。

本文将重点讲解如何将一个Spring Boot应用打包成“fat jar”——即创建一个易于部署和运行的单一文件。Spring Boot提供了开箱即用的无容器部署功能:我们只需在pom.xml中添加一些配置:

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

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

2. 构建与运行

有了这个配置后,我们可以通过标准的mvn clean install命令来构建项目,没有什么特别的步骤。

然后,我们使用以下命令运行它:java -jar <artifact-name>——非常简单直观。

虽然本文不涉及进程管理,但一个简单的保持进程运行的方法是在使用nohup命令时,即使我们关闭服务器也能继续运行:nohup java -jar <artifact-name>.jar

停止Spring Boot项目的方式与常规进程相同,无论是直接按cntrl+c还是使用kill <pid>命令。

3. fat jar / fat war

在幕后,Spring Boot会将项目的所有依赖项以及项目类一起打包到最终的文件中(因此称为“fat jar”)。内置的Tomcat服务器也一并包含。因此,生成的文件是完全自包含的,可以使用标准的Unix工具(如scp、sftp等)轻松部署,并能在任何支持JVM的服务器上运行。

默认情况下,Boot会创建一个jar文件,但如果我们在pom.xml中的packaging属性改为war,Maven会自然地生成一个war文件。这当然既可以作为独立的应用执行,也可以部署到Web容器中。

4. 更进一步的配置

大多数情况下,无需额外配置,一切“按预期工作”。但在某些特定情况下,可能需要明确告诉Spring Boot主类是什么。一种方法是在pom.xml中添加一个属性:

<properties>
    <start-class>org.baeldung.boot.Application</start-class>
</properties>

如果不继承spring-boot-starter-parent,我们需要在Maven插件中进行设置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.4.0</version>
    <configuration>
        <mainClass>org.baeldung.boot.Application</mainClass>
        <layout>ZIP</layout>
    </configuration>
</plugin>

在极少数情况下,我们可能还需要指示Maven解压某些依赖:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <requiresUnpack>
            <dependency>
                <groupId>org.jruby</groupId>
                <artifactId>jruby-complete</artifactId>
            </dependency>
        </requiresUnpack>
    </configuration>
</plugin>

5. 总结

本文探讨了使用Spring Boot构建的“fat jar”进行无服务器部署的方法。如往常一样,本篇代码示例可在GitHub上获取。


« 上一篇: HTMLUnit介绍
» 下一篇: Java泛型基础