您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringBoot項目打包發布到外部tomcat遇到的問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringBoot項目打包發布到外部tomcat遇到的問題怎么解決”文章能幫助大家解決問題。
先說遇到問題的情景:
初次嘗試使用spring boot框架寫了個小web項目,在Intellij IDEA中能正常啟動運行。使用maven 運行install,生成war包,發布到本機的tomcat下,出現異常,主要的異常信息是 .......LifeCycleException。經各種搜索,找到答案。
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及其以上版本。
最后還有最重要的一點,如果你本機的tomcat版本和 springboot自動集成的8.0版本不一致。也會出問題,解決辦法 :
我本地的Tomcat版本是8.0.28, 而服務器上的Tomcat是7.0.69。 我在本地下了個Tomcat7.0.70部署也報同樣錯誤。更加確定問題跟Tomcat版本有關。經過多方查找資料,最后在Stackoverflow上看到一個老外說SpringBoot默認Servlet容器是基于Tomcat8的
在打好的war包中確實發現了Tomcat相關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目錄,確實已經變成Tomcat7的包了
但是我還是有點疑惑, 這樣配置打成包豈不是換個Tomcat版本就要重新打次包? 既然是由于SpringBoot內部的Servlet容器造成了這個限制, 那我不用行不行? 又查了很多資料, 還真有辦法!
<!-- 打war包時加入此項, 告訴spring-boot tomcat相關jar包用外部的,不要打進去 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
關于“SpringBoot項目打包發布到外部tomcat遇到的問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。