把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)
spring boot因為內嵌tomcat容器,所以可以通過打包為jar包的方法將項目發(fā)布,但是如何將spring boot項目打包成可發(fā)布到tomcat中的war包項目呢?
1. 既然需要打包成war包項目,首先需要在pom.xml文件中修改打包類型,將spring boot默認的<packaging>jar</packaging>修改為<packaging>war</packaging>形式;
2. 其次spring boot的web項目中內嵌tomcat服務器,所以如果我們想要發(fā)布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>
有一點想說的是,如果本地開發(fā)的時候依然想要使用spring boot內嵌tomcat進行調試,添加如下依賴即可;
<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 方法。代碼舉例如下,
@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包的所有步驟,可以發(fā)布至tomcat7及其以上版本。
但是以上流程改造完spring boot打包war包發(fā)布至tomcat6版本之后,瀏覽器訪問項目地址會給出404的錯誤?為什么呢,一頭霧水,經過我一番查閱資料以及實驗,得出以下結論,
首先spring boot支持的servlet容器如下,可以看出spring boot最低支持的servlet版本是3.0,但是tomcat6的servlet版本是2.5,這樣的話上面的流程是無法支持tomcat6發(fā)布spring boot項目的,
但是又google了一番,發(fā)現(xiàn)已經有人在解決這個問題了,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文件。但是在發(fā)布war包中發(fā)現(xiàn)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開發(fā)模式,出現(xiàn)問題很難解決。即使我現(xiàn)在解決了支持tomcat6的spring boot支持問題,但是不太明白解決的原理,filter出現(xiàn)空指針是為什么?所以深入一些原理性的東西,學習技術的基礎性的東西非常重要。大家可以明白的可以解釋解釋2.5支持的原理,以及filter空指針的異常原因。
PS:如何將Spring Boot項目打包部署到外部Tomcat
1.項目打包
項目開發(fā)結束后,需要打包部署到外部服務器的Tomcat上,主要有幾種方式。
(1)生成jar包
cd 項目跟目錄(和pom.xml同級) mvn clean package ## 或者執(zhí)行下面的命令 ## 排除測試代碼后進行打包 mvn clean package -Dmaven.test.skip=true
打包完成后jar包會生成到target目錄下,命名一般是 項目名+版本號.jar
啟動jar包命令
java -jar target/spring-boot-scheduler-1.0.0.jar
這種方式,只要控制臺關閉,服務就不能訪問了。下面我們使用在后臺運行的方式來啟動:
nohup java -jar target/spring-boot-scheduler-1.0.0.jar &
也可以在啟動的時候選擇讀取不同的配置文件
java -jar app.jar --spring.profiles.active=product
也可以通過IDEA的Maven工具生成,點擊Lifecycle-install,生成jar
(2)生成war包
?。?)修改打包類型為war:<packaging>war</packaging>
<packaging>war</packaging>
(2)添加spring-boot-starter-tomcat依賴,scope設置為provided
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
?。?)注冊啟動類
創(chuàng)建ServletInitializer.java,繼承SpringBootServletInitializer ,覆蓋configure(),把啟動類Application注冊進去。外部web應用服務器構建Web Application Context的時候,會把啟動類添加進去。
public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(BootdemoApplication.class); } }
同樣也是兩種方式執(zhí)行:
?。?)mvn clean package -Dmaven.test.skip=true
(2)通過IDEA的Maven工具生成,點擊Lifecycle-package,生成war
2.項目部署
無論是用哪種方式生成,最終都是為了進行部署,war可以直接拷到tomcat的webapps目錄下,啟動Tomcat即可。
總結
以上所述是小編給大家介紹的把spring boot項目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
RabbitMQ排他性隊列Exclusive Queue詳解
這篇文章主要介紹了RabbitMQ排他性隊列Exclusive Queue詳解,如果你想創(chuàng)建一個只有自己可見的隊列,即不允許其它用戶訪問,RabbitMQ允許你將一個Queue聲明成為排他性的Exclusive Queue,需要的朋友可以參考下2023-08-08SpringMVC 參數(shù)綁定意義及實現(xiàn)過程解析
這篇文章主要介紹了SpringMVC 參數(shù)綁定意義及實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11java.Net.UnknownHostException異常處理問題解決
這篇文章主要介紹了java.Net.UnknownHostException異常處理方法,問題原因是在系統(tǒng)的?/etc/Hostname中配置了主機名,而在/etc/hosts文件中沒有相應的配置,本文給大家詳細講解,需要的朋友可以參考下2023-03-03SpringBoot中GlobalExceptionHandler異常處理機制詳細說明
Spring Boot的GlobalExceptionHandler是一個全局異常處理器,用于捕獲和處理應用程序中發(fā)生的所有異常,這篇文章主要給大家介紹了關于Java中GlobalExceptionHandler異常處理機制的相關資料,需要的朋友可以參考下2024-03-03Nacos下線服務時,下線報錯選舉Leader失敗問題以及解決
這篇文章主要介紹了Nacos下線服務時,下線報錯選舉Leader失敗問題以及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07解決Required request body is missing錯誤的問題
這篇文章主要介紹了解決Required request body is missing錯誤的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06