springboot學習筆記:6.內建tomcat啟動和外部tomcat部署總結

weixin_30329623發表於2018-01-22

springboot的web專案的啟動主要分為:

一.使用內建tomcat啟動

啟動方式:

1、IDEA中main函式啟動

2、mvn springboot-run 命令

3、java -jar XXX.jar

配置內建tomcat屬性:

關於Tomcat的屬性都在org.springframework.boot.autoconfigure.web.ServerProperties配置類中做了定義,我們只需在application.properties配置屬性做配置即可。通用的Servlet容器配置都已”server”左右字首,而Tomcat特有配置都以”server.tomcat”作為字首。下面舉一些常用的例子。

配置Servlet容器:

#配置程式埠,預設為8080
server.port= 8080
#使用者繪畫session過期時間,以秒為單位
server.session.timeout=
# 配置預設訪問路徑,預設為/
server.context-path=

 

配置Tomcat:

# 配置Tomcat編碼,預設為UTF-8
server.tomcat.uri-encoding=UTF-8
# 配置最大執行緒數
server.tomcat.max-threads=1000

 

二.使用外接tomcat部署

配置步驟:

1、繼承SpringBootServletInitializer

  • 外部容器部署的話,就不能依賴於Application的main函式了,而是要以類似於web.xml檔案配置的方式來啟動Spring應用上下文,此時我們需要在啟動類中繼承SpringBootServletInitializer並實現configure方法:

package com.zjt.chapter05;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class Chapter05Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Chapter05Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Chapter05Application.class, args);
    }
}

 

這個類的作用與在web.xml中配置負責初始化Spring應用上下文的監聽器作用類似,只不過在這裡不需要編寫額外的XML檔案了。

 2、pom.xml修改tomcat相關的配置

  首先介紹下maven中scope依賴範圍的概念,因為後續涉及到這個會有問題。

  依賴範圍就是用來控制依賴和三種classpath(編譯classpath,測試classpath、執行classpath)的關係,Maven有如下幾種依賴範圍:

  • compile:編譯依賴範圍。如果沒有指定,就會預設使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、執行三種classpath都有效。典型的例子是spring-code,在編譯、測試和執行的時候都需要使用該依賴。

  • test: 測試依賴範圍。使用次依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主程式碼或者執行專案的使用時將無法使用此依賴。典型的例子是Jnuit,它只有在編譯測試程式碼及執行測試的時候才需要。

  • provided:已提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試classpath有效,但在執行時候無效。典型的例子是servlet-api,編譯和測試專案的時候需要該依賴,但在執行專案的時候,由於容器以及提供,就不需要Maven重複地引入一遍。

 

 

如果要將最終的打包形式改為war的話,還需要對pom.xml檔案進行修改,因為spring-boot-starter-web中包含內嵌的tomcat容器,所以直接部署在外部容器會衝突報錯。這裡有兩種方法可以解決,如下

方法一:

<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>

 

在這裡需要移除對嵌入式Tomcat的依賴,這樣打出的war包中,在lib目錄下才不會包含Tomcat相關的jar包,否則將會出現啟動錯誤。

還有一個很關鍵的關鍵點,就是tomcat-embed-jasper中scope必須是provided。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

 

因為SpringBootServletInitializer需要依賴 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有這個javax.servlet,如果沒用provided,最終打好的war裡面會有servlet-api這個jar,這樣就會跟tomcat本身的衝突了。這個關鍵點同樣適應於下面說的第二種方法。

方法二:

直接新增如下配置即可:

<!--部署成war包時開啟↓↓↓↓-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--部署成war包時開啟↑↑↑↑-->

 

provided的作用上面已經介紹的很透徹了,這裡就不囉嗦了,這種方式的好處是,打包的war包同時適合java -jar命令啟動以及部署到外部容器中。

 

3、由jar變成war

<packaging>war</packaging>

4、注意的問題

此時打成的包的名稱應該和application.properties的 
server.context-path=/test

保持一致

<build>
    <finalName>test</finalName>
</build>

 

如果不一樣釋出到tomcat的webapps下上下文會變化

 

原始碼:https://github.com/zhaojiatao/springboot-zjt-chapter05.git

 

轉載於:https://www.cnblogs.com/zhaojiatao/p/8331553.html

相關文章