Spring Boot Jar包和war包的區別

Spring Boot無論是打成Jar包還是War包都可以獨立運行,那麼他們有什麼區別呢?

Spring Boot Jar包和war包的區別

1.packaging的方式不同,一種設置成jar一種是war。

Spring Boot Jar包和war包的區別

2.繼承的方式不同。

Application.java需要繼承SpringBootServletInitializer,而jar包不需要。

下面是war繼承的方式:

Spring Boot Jar包和war包的區別

3.spring boot內置tomcat 。

springboot內置tomcat容器,默認tomcat8的版本,war包部署時,需要在pom文件中有關跟tomcat有關係的jar包scope都設置成provided。

去掉spring boot內置的tomcat代碼:

Spring Boot Jar包和war包的區別

4.也就是說,在將Jar包轉變為War包時,我們需要做一些配置上及代碼上的調整即可。

如果我們想要將這個JAR包轉換成可以在Servlet容器中部署的WAR的話,就不能依賴於Application的main函數了,而是要以類似於web.xml文件配置的方式來啟動Spring應用上下文,此時我們需要聲明這樣一個類:

Spring Boot Jar包和war包的區別

這個類的作用與在web.xml中配置負責初始化Spring應用上下文的監聽器作用類似,只不過在這裡不需要編寫額外的XML文件了。

如果要將最終的打包形式改為WAR的話,還需要對pom.xml文件進行修改,除了需要將packaging的值修改為war以外,還需要對依賴進行適當的配置(這一部分在Spring Boot的樣例和文檔中均未提及,提醒大家注意):

Spring Boot Jar包和war包的區別

在這裡需要移除對嵌入式Tomcat的依賴,這樣打出的WAR包中,在lib目錄下才不會包含Tomcat相關的JAR包,否則將會出現啟動錯誤。另外,在移除對Tomcat的依賴後,為了保證編譯正確,還需要添加對servlet-api的依賴,因此添加如下的配置:

Spring Boot Jar包和war包的區別

在這裡將scope屬性設置為provided,這樣在最終形成的WAR中不會包含這個JAR包,因為Tomcat或Jetty等服務器在運行時將 會提供相關的API類。此時,執行mvn package命令就會得到一個WAR文件,我們可以直接將其放到Tomcat下運行(需要7.0.42版本以上)。


分享到:


相關文章: