SpringBoot項目打包發(fā)布到外部tomcat(出現(xiàn)各種異常的解決)
先說遇到問題的情景:
初次嘗試使用spring boot框架寫了個小web項目,在Intellij IDEA中能正常啟動運行。使用maven 運行install,生成war包,發(fā)布到本機(jī)的tomcat下,出現(xiàn)異常,主要的異常信息是 .......LifeCycleException。經(jīng)各種搜索,找到答案。
spring boot因為內(nèi)嵌tomcat容器,所以可以通過打包為jar包的方法將項目發(fā)布,但是如何將spring boot項目打包成可發(fā)布到tomcat中的war包項目呢?
1. 既然需要打包成war包項目,首先需要在pom.xml文件中修改打包類型,將spring boot默認(rèn)的<packaging>jar</packaging>修改為<packaging>war</packaging>形式;
2. 其次spring boot的web項目中內(nèi)嵌tomcat服務(wù)器,所以如果我們想要發(fā)布war包到tomcat項目,要講spring boot中內(nèi)嵌的tomcat包依賴排除,不然產(chǎn)生沖突,打開下面代碼中的注釋即可。
<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內(nèi)嵌tomcat進(jìn)行調(diào)試,添加如下依賴即可;
<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及其以上版本。
最后還有最重要的一點,如果你本機(jī)的tomcat版本和 springboot自動集成的8.0版本不一致。也會出問題,解決辦法 :
我本地的Tomcat版本是8.0.28, 而服務(wù)器上的Tomcat是7.0.69。 我在本地下了個Tomcat7.0.70部署也報同樣錯誤。更加確定問題跟Tomcat版本有關(guān)。經(jīng)過多方查找資料,最后在Stackoverflow上看到一個老外說SpringBoot默認(rèn)Servlet容器是基于Tomcat8的
在打好的war包中確實發(fā)現(xiàn)了Tomcat相關(guān)jar包,而且是Tomcat8的,拿Tomcat8的embed包在Tomcat7下面那肯定是不能用啊

要支持低版本Tomcat需要在maven中指定Tomat版本,配置如下:
<properties> <tomcat.version>7.0.69</tomcat.version> </properties>
然后依賴中加上(這個其實不加也行, 官方文檔是加上的)
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
加上以后試了下,果然是沒問題了。看了下war包中的lib目錄,確實已經(jīng)變成Tomcat7的包了

但是我還是有點疑惑, 這樣配置打成包豈不是換個Tomcat版本就要重新打次包? 既然是由于SpringBoot內(nèi)部的Servlet容器造成了這個限制, 那我不用行不行? 又查了很多資料, 還真有辦法!
<!-- 打war包時加入此項, 告訴spring-boot tomcat相關(guān)jar包用外部的,不要打進(jìn)去 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
試了下, 加上這個后, 上面說Tomcat的版本無需指定了, 耶! ^_^
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Filter攔截器如何實現(xiàn)請求跨域轉(zhuǎn)發(fā)
這篇文章主要介紹了使用Filter攔截器如何實現(xiàn)請求跨域轉(zhuǎn)發(fā),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
基于SpringBoot整合SSMP案例(開啟日志與分頁查詢條件查詢功能實現(xiàn))
這篇文章主要介紹了基于SpringBoot整合SSMP案例(開啟日志與分頁查詢條件查詢功能實現(xiàn)),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋參考下吧2023-11-11
Servlet連接數(shù)據(jù)庫實現(xiàn)用戶登錄的實現(xiàn)示例
本文主要介紹了Servlet連接數(shù)據(jù)庫實現(xiàn)用戶登錄的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
SpringBoot實用小技巧之如何動態(tài)設(shè)置日志級別
這篇文章主要給大家介紹了關(guān)于SpringBoot實用小技巧之如何動態(tài)設(shè)置日志級別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
springboot整合rocketmq實現(xiàn)分布式事務(wù)
大多數(shù)情況下很多公司是使用消息隊列的方式實現(xiàn)分布式事務(wù)。 本篇文章重點講解springboot環(huán)境下整合rocketmq實現(xiàn)分布式事務(wù),感興趣的可以了解一下2021-05-05
基于java swing實現(xiàn)答題系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于java swing實現(xiàn)答題系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Java實現(xiàn)的進(jìn)制轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了Java實現(xiàn)的進(jìn)制轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了Java實現(xiàn)二進(jìn)制、十六進(jìn)制、字符串、數(shù)組等相關(guān)轉(zhuǎn)換操作技巧,需要的朋友可以參考下2018-07-07

