spring boot因?yàn)閮?nèi)嵌tomcat容器,,所以可以通過(guò)打包為jar包的方法將項(xiàng)目發(fā)布,,但是如何將spring boot項(xiàng)目打包成可發(fā)布到tomcat中的war包項(xiàng)目呢?
1. 既然需要打包成war包項(xiàng)目,,首先需要在pom.xml文件中修改打包類型,,將spring boot默認(rèn)的<packaging>jar</packaging>修改為<packaging>war</packaging>形式,;
2. 其次spring boot的web項(xiàng)目中內(nèi)嵌tomcat服務(wù)器,所以如果我們想要發(fā)布war包到tomcat項(xiàng)目,,要講spring boot中內(nèi)嵌的tomcat包依賴排除,,不然產(chǎn)生沖突,打開下面代碼中的注釋即可,。
1 2 3 4 5 6 7 8 9 10 11 12 | < 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 >
|
有一點(diǎn)想說(shuō)的是,,如果本地開發(fā)的時(shí)候依然想要使用spring boot內(nèi)嵌tomcat進(jìn)行調(diào)試,添加如下依賴即可,;
1 2 3 4 5 | < dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-tomcat</ artifactId >
< scope >provided</ scope >
</ dependency >
|
3. spring boot發(fā)布jar包web程序的入口是main函數(shù)所在的類,,使用@SpringBootApplication注解。但是如果war包發(fā)布至tomcat,,需要增加 SpringBootServletInitializer 子類,,并覆蓋它的 configure 方法,或者直接將main函數(shù)所在的類繼承 SpringBootServletInitializer 子類,,并覆蓋它的 configure 方法,。代碼舉例如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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項(xiàng)目打包war包的所有步驟,,可以發(fā)布至tomcat7及其以上版本,。
但是以上流程改造完spring boot打包war包發(fā)布至tomcat6版本之后,瀏覽器訪問(wèn)項(xiàng)目地址會(huì)給出404的錯(cuò)誤,?為什么呢,,一頭霧水,經(jīng)過(guò)我一番查閱資料以及實(shí)驗(yàn),,得出以下結(jié)論,,
首先spring boot支持的servlet容器如下,,可以看出spring boot最低支持的servlet版本是3.0,,但是tomcat6的servlet版本是2.5,這樣的話上面的流程是無(wú)法支持tomcat6發(fā)布spring boot項(xiàng)目的,,
但是又google了一番,,發(fā)現(xiàn)已經(jīng)有人在解決這個(gè)問(wèn)題了,https://github.com/dsyer/spring-boot-legacy,,
標(biāo)題就表明了它是為了讓spring boot支持servlet2.5,,剛好解決我們的痛點(diǎn),使用步驟如下:
1. pom.xml中添加spring-boot-legacy的依賴,,
1 2 3 4 5 | < dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-legacy</ artifactId >
< version >1.1.0.RELEASE</ version >
</ dependency >
|
2.手動(dòng)替換web.xml文件,。但是在發(fā)布war包中發(fā)現(xiàn)metricFilter提示空指針異常,我就簡(jiǎn)單粗暴的將filter過(guò)濾了,,注釋如下,。 所要替換的web.xml文件的未知如下 : {工程目錄}/src/main/webapp/WEB-INF/web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <? xml version="1.0" encoding="UTF-8"?>
< web-app version="2.5" xmlns="http://java./xml/ns/javaee"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://java./xml/ns/javaee http://java./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 >
|
完成以上兩個(gè)步驟就可以讓spring boot項(xiàng)目支持tomcat6的部署了,,解決。
思考:spring boot封裝帶來(lái)了便利性,,同時(shí)也帶來(lái)了出問(wèn)題的解決復(fù)雜度,,如果不了解原始的spring web開發(fā)模式,出現(xiàn)問(wèn)題很難解決,。即使我現(xiàn)在解決了支持tomcat6的spring boot支持問(wèn)題,,但是不太明白解決的原理,filter出現(xiàn)空指針是為什么,?所以深入一些原理性的東西,,學(xué)習(xí)技術(shù)的基礎(chǔ)性的東西非常重要。大家可以明白的可以解釋解釋2.5支持的原理,,以及filter空指針的異常原因,。
最后感謝前輩們的資料,
參考資料:
1.如何讓 Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器(李威威)
2.springboot 開發(fā)入門,,及問(wèn)題匯總
|