1. 程式人生 > >spring-boot採用war包啟動模式。

spring-boot採用war包啟動模式。

一、demo的結構預覽

    二、在jar包啟動的基礎上,需要增加的地方

    1)、改成war的maven專案,並且用maven外掛忽略web.xml或者像我這樣建個空的web.xml

       1.1 pom中加  <packaging>war</packaging>

       1.2  加空檔案。

   2)、建立一個類實現SpringBootServletInitializer ,並且覆蓋 configure方法,在方法內注入你標記啟動的類。

/**
 * war包啟動!  ----就是圖1標了紅圈的第二個類
 */
public class ApplicationWar extends SpringBootServletInitializer  {

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

  3)、在pom檔案中將內建容器變成provided

    	<!-- 內建容器標記成provided -->
		    <dependency>
		        <groupId>org.springframework.boot</groupId>
		        <artifactId>spring-boot-starter-tomcat</artifactId>
		        <scope>provided</scope>
		    </dependency>

  4)、

(不是必須)加個tomcat外掛或者jetty外掛。

        <!-- tomcat 啟動外掛 -->
	<plugin>
		<groupId>org.apache.tomcat.maven</groupId>
		<artifactId>tomcat7-maven-plugin</artifactId>
		<version>2.2</version>
		<configuration>
			<path>/</path>
			<uriEncoding>UTF-8</uriEncoding>
			<port>8082</port> //我這個埠故意弄成和jar啟動不一樣
			<server>tomcat7</server>
		</configuration>
	</plugin>

三、效果。

3.1、用maven的tomcat外掛啟動了個war包埠8082,還用main函式啟動內建tomcat,埠8080.

   

四、其他

    啟動原理大概:

main函式裡面SpringApplication.run()是先啟動內建tomcat,再把spring容器建立,並注入servletContext。而用war啟動,等於servlet3.0裡面只要實現了“某介面”,就會執行這個介面的startup方法,而spring內部就實現了這個介面,再去找你實現的spring的某個介面,最後把你的啟動類注入進去,然後呼叫SpringApplication.run,這個時候就不會注入內建tomcat的servletContext,而是外部的servletContext了。