前提
這篇文章是《SpringBoot2.x入門》專輯的第5篇文章,使用的SpringBoot
版本為2.3.1.RELEASE
,JDK
版本為1.8
。
這篇文章分析一個偏向於運維方面的內容:SpringBoot
應用的打包與啟動,分別會分析嵌入式Servlet
容器和非嵌入式Servlet
容器下的應用打包與啟動,Servlet
容器以比較常用的Tomcat
為例。
嵌入式Tomcat的打包與啟動
嵌入式Tomcat
由spring-boot-starter-web
這個starter
自帶,因此不需要改動關於Servlet
容器的依賴。新建一個啟動類club.throwable.ch4.Ch4Application
:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Ch4Application {
public static void main(String[] args) {
SpringApplication.run(Ch4Application.class, args);
}
}
新增一個主配置檔案application.properties
:
server.port=9094
spring.application.name=ch4-embedded-tomcat-deploy
然後在專案的pom.xml
引入Maven
外掛``:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
然後使用命令mvn clean compile package
(mvn clean
、mvn compile
和mvn package
的組合命令)打包即可:
如果編譯和打包命令執行成功的話,控制檯輸出BUILD SUCCESS:
同時專案的target
目錄下(除了一些編譯出來的class
檔案)會多出了一個Jar
包和一個x.jar.original
檔案:
而這個Jar
檔案正是可執行的檔案,可以通過命令(確保已經安裝JDK
並且把JRE
的bin
目錄新增到系統的Path
中)執行:
java -jar ch4-embedded-tomcat-deploy.jar
控制檯輸出如下:
一般情況下Jar
的執行命令是:
java [VM_OPTIONS] -jar 應用名.jar [SPRING_OPTIONS]
例如:
java -Xms1g -Xmx2g -jar ch4-embedded-tomcat-deploy.jar --spring.profiles.active=default
上面的命令會導致應用掛起在控制檯,只要退出控制檯,應用就會被Shutdown
。如果在Linux
下,可以使用nohup
(其實就是no hang up
的縮寫)命令不結束通話地執行Jar
應用,例如:
nohup java -Xms1g -Xmx2g -jar ch4-embedded-tomcat-deploy.jar --spring.profiles.active=default >/dev/null 2>&1 &
非嵌入式Tomcat的打包與啟動
一般情況下,非嵌入式Tomcat
需要打包成一個war
檔案,然後放到外部的Tomcat
服務中執行。
- 首先要移除掉
spring-boot-starter-web
依賴中的嵌入式Tomcat
相關的依賴,並且引入servlet-api
依賴。 - 還要把打包方式設定為
war
(<packaging>jar</packaging>
替換為<packaging>war</packaging>
)。 - 最後還要升級
maven-war-plugin
外掛避免因為缺失web.xml
檔案導致打包失敗。
這裡為了滿足相容性,使用的Tomcat
版本最好和spring-boot-starter-web
中引用的嵌入式Tomcat
的依賴版本完全一致,在SpringBoot:2.3.1.RELEASE
中,該版本為9.0.36
,pom.xml
的依賴內容如下:
<packaging>war</packaging>
<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>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>9.0.36</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>ch3-tomcat-deploy</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
這裡其實可以選擇不排除spring-boot-starter-tomcat
,而是把它的作用域縮小為provided
,這樣就能避免額外引入servlet-api
依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
新建一個啟動類club.throwable.ch3.Ch3Application
,必須繼承SpringBootServletInitializer
並且重寫configure()
方法執行入口類:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class Ch3Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Ch3Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Ch3Application.class);
}
}
然後使用命令mvn clean compile package
打包:
下載Tomcat9.0.36
,下載地址是https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.36/bin
(因為開發機的系統是64bit的Windows10系統):
加壓Tomcat
後,把ch3-tomcat-deploy.war
拷貝到webapps
目錄下,然後使用bin/startup.bat
啟動Tomcat
:
由於application.properties
裡面管理的埠和服務上下文路徑配置會失效,需要從Tomcat
的入口訪問服務,如http://localhost:8080/ch3-tomcat-deploy/
。
小結
這篇文章分別介紹SpringBoot
的Jar
和War
兩種打包和部署方式,其實更推薦Jar
包的方式,因為嵌入式容器對於開發和釋出而言都會相對簡便,而且它是SpringBoot
預設的啟動方式,該方式下預設就支援靜態資源整合到Jar
包中,可以直接訪問。在前後端分離的大型應用中,相對輕量級可以脫離外部容器直接執行的部署方式明顯更加吃香。
專案倉庫:
(本文完 c-2-d e-a-20200709 1:15 AM)
技術公眾號《Throwable文摘》(id:throwable-doge),不定期推送筆者原創技術文章(絕不抄襲或者轉載):