SpringBoot2.x入門:應用打包與啟動
阿新 • • 發佈:2020-07-09
## 前提
這篇文章是《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`:
```java
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`:
```properties
server.port=9094
spring.application.name=ch4-embedded-tomcat-deploy
```
然後在專案的`pom.xml`引入`Maven`外掛``:
```xml
org.springframework.boot
spring-boot-maven-plugin
${spring.boot.version}
repackage
```
然後使用命令`mvn clean compile package`(`mvn clean`、`mvn compile`和`mvn package`的組合命令)打包即可:
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-1.png)
如果編譯和打包命令執行成功的話,控制檯輸出**BUILD SUCCESS**:
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-2.png)
同時專案的`target`目錄下(除了一些編譯出來的`class`檔案)會多出了一個`Jar`包和一個`x.jar.original`檔案:
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-3.png)
而這個`Jar`檔案正是可執行的檔案,可以通過命令(確保已經安裝`JDK`並且把`JRE`的`bin`目錄新增到系統的`Path`中)執行:
```shell
java -jar ch4-embedded-tomcat-deploy.jar
```
控制檯輸出如下:
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-4.png)
一般情況下`Jar`的執行命令是:
```shell
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`應用,例如:
```shell
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`(`jar `替換為`war `)。
- 最後還要升級`maven-war-plugin`外掛避免因為缺失`web.xml`檔案導致打包失敗。
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-5.png)
這裡為了滿足相容性,使用的`Tomcat`版本最好和`spring-boot-starter-web`中引用的嵌入式`Tomcat`的依賴版本完全一致,在`SpringBoot:2.3.1.RELEASE`中,該版本為`9.0.36`,`pom.xml`的依賴內容如下:
```xml
war
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.apache.tomcat
tomcat-servlet-api
9.0.36
provided
ch3-tomcat-deploy
org.springframework.boot
spring-boot-maven-plugin
${spring.boot.version}
repackage
org.apache.maven.plugins
maven-war-plugin
3.3.0
```
這裡其實可以選擇不排除`spring-boot-starter-tomcat`,而是把它的作用域縮小為`provided`,這樣就能避免額外引入`servlet-api`依賴:
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
provided
```
新建一個啟動類`club.throwable.ch3.Ch3Application`,必須繼承`SpringBootServletInitializer`並且重寫`configure()`方法執行入口類:
```java
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`打包:
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-6.png)
下載`Tomcat9.0.36`,下載地址是`https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.36/bin`(因為開發機的系統是64bit的Windows10系統):
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-7.png)
加壓`Tomcat`後,把`ch3-tomcat-deploy.war`拷貝到`webapps`目錄下,然後使用`bin/startup.bat`啟動`Tomcat`:
![](https://throwable-blog-1256189093.cos.ap-guangzhou.myqcloud.com/202007/s-p-g-ch5-8.png)
由於`application.properties`裡面管理的埠和服務上下文路徑配置會失效,需要從`Tomcat`的入口訪問服務,如`http://localhost:8080/ch3-tomcat-deploy/`。
## 小結
這篇文章分別介紹`SpringBoot`的`Jar`和`War`兩種打包和部署方式,其實更推薦`Jar`包的方式,因為嵌入式容器對於開發和釋出而言都會相對簡便,而且它是`SpringBoot`預設的啟動方式,該方式下預設就支援靜態資源整合到`Jar`包中,可以直接訪問。在前後端分離的大型應用中,相對輕量級可以脫離外部容器直接執行的部署方式明顯更加吃香。
專案倉庫:
- Github:https://github.com/zjcscut/spring-boot-guide
(本文完 c-2-d e-a-20200709 1:15 AM)
技術公眾號《Throwable文摘》(id:throwable-doge),不定期推送筆者原創技術文章(絕不抄襲或者轉載):
![](https://public-1256189093.cos.ap-guangzhou.myqcloud.com/static/wechat-account-lo