1. 程式人生 > >SpringBoot2.x入門:應用打包與啟動

SpringBoot2.x入門:應用打包與啟動

## 前提 這篇文章是《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