最近實驗室的一些項目採用了Spring Boot架構進行開發。項目完成之後,就須要部署到服務器。常規辦法就是將項目打成war包,直接拖到tomcat的webaaps下,可是Spring boot 的默認是將項目打成jar包,因此就須要進行一些配置。百度和Google了配置方法都是大同小異。html
不過網上的例子大部分都是使用的是Eclipse+Maven ,咱們實驗室使用的idea+gradle。因此就有一些小的變化,不過都是相通的。須要修改的地方是:web
Application中spring
這裏繼承SpringBootServletInitializer 並重寫其中的configure方法目的是使用Spring框架的Servlet3.0支持。而且容許咱們能夠配置項目從serclet容器中啓動。tomcat
在build.gradle裏配置服務器
主要是添加war包的支持,其次的話就是在spring-boot-starter-tomcat處改成provided。provided和compile的區別在與前者是在調試使用時會加載對應的包,可是 在打包時不會講對應的包加入到war包的lib中然後者則是兩種狀況都要調用對應的包。websocket
至此基本的配置都已經完成了。前面的工做的目的都是防止Spring Boot中內置的Tomcat 與實際的tomcat容器產生衝突。架構
這樣的話一個常規的Spring Boot項目就能夠直接打包部署,可是今天在部署另一個項目時遇到了一個奇葩的問題(經驗不足。。。),項目在啓動時報以下的錯:框架
排查了很久,終於在Stackoverflow(不得不說是程序猿的好幫手啊)找到了解決辦法,外國兄弟和我遇到了一樣一個問題。socket
下圖是解決方式之一,他的意思大概是tomcat中的websocket jars與項目中的包衝突了,建議是刪除產生對應的包。並貼圖列舉了哪些包是形成問題的緣由。可是按照他的辦法並無解決個人問題,仍是一樣的錯誤。ide
因而我繼續向下看,發現了另一個解決辦法:
按照這個辦法在build.gradle中找到對應的代碼,註釋掉,重啓服務器,項目成功啓動。
分析其中的緣由:原來是這個項目中多引用了Spring-boot-starter-jetty這個包,與tomcat容器產生了衝突。致使 了啓動失敗。
之後還須要多分析和細心檢查
另外貼上Spring boot打包的一篇文章:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
Ps.若有錯誤還請各位大大指教。