Spring Boot無論是打成Jar包還是War包都可以獨立運行,那麼他們有什麼區別呢?
1.packaging的方式不同,一種設置成jar一種是war。
2.繼承的方式不同。
Application.java需要繼承SpringBootServletInitializer,而jar包不需要。
下面是war繼承的方式:
3.spring boot內置tomcat 。
springboot內置tomcat容器,默認tomcat8的版本,war包部署時,需要在pom文件中有關跟tomcat有關係的jar包scope都設置成provided。
去掉spring boot內置的tomcat代碼:
4.也就是說,在將Jar包轉變為War包時,我們需要做一些配置上及代碼上的調整即可。
如果我們想要將這個JAR包轉換成可以在Servlet容器中部署的WAR的話,就不能依賴於Application的main函數了,而是要以類似於web.xml文件配置的方式來啟動Spring應用上下文,此時我們需要聲明這樣一個類:
這個類的作用與在web.xml中配置負責初始化Spring應用上下文的監聽器作用類似,只不過在這裡不需要編寫額外的XML文件了。
如果要將最終的打包形式改為WAR的話,還需要對pom.xml文件進行修改,除了需要將packaging的值修改為war以外,還需要對依賴進行適當的配置(這一部分在Spring Boot的樣例和文檔中均未提及,提醒大家注意):
在這裡需要移除對嵌入式Tomcat的依賴,這樣打出的WAR包中,在lib目錄下才不會包含Tomcat相關的JAR包,否則將會出現啟動錯誤。另外,在移除對Tomcat的依賴後,為了保證編譯正確,還需要添加對servlet-api的依賴,因此添加如下的配置:
在這裡將scope屬性設置為provided,這樣在最終形成的WAR中不會包含這個JAR包,因為Tomcat或Jetty等服務器在運行時將 會提供相關的API類。此時,執行mvn package命令就會得到一個WAR文件,我們可以直接將其放到Tomcat下運行(需要7.0.42版本以上)。
閱讀更多 Java比海盜 的文章