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

throwable發表於2020-07-09

前提

這篇文章是《SpringBoot2.x入門》專輯的第5篇文章,使用的SpringBoot版本為2.3.1.RELEASEJDK版本為1.8

這篇文章分析一個偏向於運維方面的內容:SpringBoot應用的打包與啟動,分別會分析嵌入式Servlet容器和非嵌入式Servlet容器下的應用打包與啟動,Servlet容器以比較常用的Tomcat為例。

嵌入式Tomcat的打包與啟動

嵌入式Tomcatspring-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 packagemvn cleanmvn compilemvn package的組合命令)打包即可:

如果編譯和打包命令執行成功的話,控制檯輸出BUILD SUCCESS

同時專案的target目錄下(除了一些編譯出來的class檔案)會多出了一個Jar包和一個x.jar.original檔案:

而這個Jar檔案正是可執行的檔案,可以通過命令(確保已經安裝JDK並且把JREbin目錄新增到系統的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.36pom.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/

小結

這篇文章分別介紹SpringBootJarWar兩種打包和部署方式,其實更推薦Jar包的方式,因為嵌入式容器對於開發和釋出而言都會相對簡便,而且它是SpringBoot預設的啟動方式,該方式下預設就支援靜態資源整合到Jar包中,可以直接訪問。在前後端分離的大型應用中,相對輕量級可以脫離外部容器直接執行的部署方式明顯更加吃香。

專案倉庫:

(本文完 c-2-d e-a-20200709 1:15 AM)

技術公眾號《Throwable文摘》(id:throwable-doge),不定期推送筆者原創技術文章(絕不抄襲或者轉載):

相關文章