1. 引言
近年來,Web應用程序部署方式的簡化是一個令人振奮的發展。
省略冗長的歷史背景,我們來到了今天——我們不再需要使用繁瑣的 Servlet 和 XML 樣板代碼,更主要的是,不再需要服務器本身。
本文將集中討論如何將 Spring Boot 應用程序打包為一個“胖 JAR”文件——即創建一個易於部署和運行的單個工件。
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>.
停止 spring-boot 項目與停止普通進程沒有區別,無論我們使用 cntrl+c 還是 kill <pid>.
3. 胖 JAR / 胖戰爭
在幕後,spring-boot 將所有項目依賴打包到最終的 Artifact 中,同時包含項目類(因此產生了“胖” JAR)。 嵌入式 Tomcat 服務器也內置其中。
因此,最終的 Artifact 是完全自包含的,易於使用標準 Unix 工具(scp、sftp…等)部署,並且可以在具有 JVM 的任何服務器上運行。
默認情況下,Boot 創建一個 jar 文件 – 但如果我們更改 pom.xml 中的 packaging 屬性為 war,Maven 將會自然地 構建 WAR 文件。
這當然既可作為獨立應用程序執行,也可部署到 Web 容器。
4. 進一步配置
通常情況下,不需要進行額外的配置,一切“就緒運行”,但在某些特定情況下,我們需要明確地告知 spring-boot 主類信息。 可以通過添加一個屬性來實現:
<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>結論
本文介紹了使用由 spring-boot 構建的“胖” JAR 包進行無服務器部署的方法。