spring boot由於內嵌tomcat容器,因此能夠經過打包爲jar包的方法將項目發佈,可是如何將spring boot項目打包成可發佈到tomcat中的war包項目呢?html
1. 既然須要打包成war包項目,首先須要在pom.xml文件中修改打包類型,將spring boot默認的<packaging>jar</packaging>修改成<packaging>war</packaging>形式;java
2. 其次spring boot的web項目中內嵌tomcat服務器,因此若是咱們想要發佈war包到tomcat項目,要講spring boot中內嵌的tomcat包依賴排除,否則產生衝突,打開下面代碼中的註釋便可。git
<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>
有一點想說的是,若是本地開發的時候依然想要使用spring boot內嵌tomcat進行調試,添加以下依賴便可;github
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
3. spring boot發佈jar包web程序的入口是main函數所在的類,使用@SpringBootApplication註解。可是若是war包發佈至tomcat,須要增長 SpringBootServletInitializer
子類,並覆蓋它的 configure
方法,或者直接將main函數所在的類繼承 SpringBootServletInitializer
子類,並覆蓋它的 configure
方法。代碼舉例以下,web
@SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure( SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
以上就完成了spring boot項目打包war包的全部步驟,能夠發佈至tomcat7及其以上版本。spring
可是以上流程改造完spring boot打包war包發佈至tomcat6版本以後,瀏覽器訪問項目地址會給出404的錯誤?爲何呢,一頭霧水,通過我一番查閱資料以及實驗,得出如下結論,瀏覽器
首先spring boot支持的servlet容器以下,能夠看出spring boot最低支持的servlet版本是3.0,可是tomcat6的servlet版本是2.5,這樣的話上面的流程是沒法支持tomcat6發佈spring boot項目的,tomcat
可是又google了一番,發現已經有人在解決這個問題了,https://github.com/dsyer/spring-boot-legacy,springboot
標題就代表了它是爲了讓spring boot支持servlet2.5,恰好解決咱們的痛點,使用步驟以下:服務器
1. pom.xml中添加spring-boot-legacy的依賴,
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-legacy</artifactId> <version>1.1.0.RELEASE</version> </dependency>
2.手動替換web.xml文件。可是在發佈war包中發現metricFilter提示空指針異常,我就簡單粗暴的將filter過濾了,註釋以下。 所要替換的web.xml文件的未知以下 : {工程目錄}/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.example.DemoApplication</param-value> </context-param> <listener> <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class> </listener> <!-- <filter> <filter-name>metricFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>metricFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextAttribute</param-name> <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
完成以上兩個步驟就可讓spring boot項目支持tomcat6的部署了,解決。
思考:spring boot封裝帶來了便利性,同時也帶來了出問題的解決複雜度,若是不瞭解原始的spring web開發模式,出現問題很難解決。即便我如今解決了支持tomcat6的spring boot支持問題,可是不太明白解決的原理,filter出現空指針是爲何?因此深刻一些原理性的東西,學習技術的基礎性的東西很是重要。你們能夠明白的能夠解釋解釋2.5支持的原理,以及filter空指針的異常緣由。
最後感謝前輩們的資料,
參考資料: