spring boot項目發布tomcat容器(包含發布到tomcat6的方法)


spring boot因為內嵌tomcat容器,所以可以通過打包為jar包的方法將項目發布,但是如何將spring boot項目打包成可發布到tomcat中的war包項目呢?

1. 既然需要打包成war包項目,首先需要在pom.xml文件中修改打包類型,將spring boot默認的<packaging>jar</packaging>修改為<packaging>war</packaging>形式;

2. 其次spring boot的web項目中內嵌tomcat服務器,所以如果我們想要發布war包到tomcat項目,要講spring boot中內嵌的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>            

有一點想說的是,如果本地開發的時候依然想要使用spring boot內嵌tomcat進行調試,添加如下依賴即可;

<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 方法。代碼舉例如下,

@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 boot打包war包發布至tomcat6版本之后,瀏覽器訪問項目地址會給出404的錯誤?為什么呢,一頭霧水,經過我一番查閱資料以及實驗,得出以下結論,

首先spring boot支持的servlet容器如下,可以看出spring boot最低支持的servlet版本是3.0,但是tomcat6的servlet版本是2.5,這樣的話上面的流程是無法支持tomcat6發布spring boot項目的,

但是又google了一番,發現已經有人在解決這個問題了,https://github.com/dsyer/spring-boot-legacy

 

標題就表明了它是為了讓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空指針的異常原因。

 

最后感謝前輩們的資料,

參考資料:  

1.如何讓 Spring Boot 項目發布到 Tomcat 服務器(李威威)

2.springboot 開發入門,及問題匯總

               


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM