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上获取。