1. 程式人生 > >SpringBoot建工程jar工程和war工程的區別

SpringBoot建工程jar工程和war工程的區別

此文為轉載:http://mrlee23.iteye.com/blog/2047968

在開發除錯完成之後,可以將應用打成JAR包的形式,在Eclipse中可以直接使用Maven外掛的package命令,最終會形成一個可執行的 JAR包。我們使用java –jar命令就可以執行這個JAR包了。Myeclipse的Maven的package請參考(http://mrlee23.iteye.com/blog/2047946 )所呈現出的效果與在除錯期是一樣的。現在看一下這個JAR包解壓後的目錄結構:

 

這個JAR包與傳統JAR包的不同之處在於裡面有一個名為lib的目錄,在這個目錄中包含了這個簡單應用所依賴的其他JAR包,其中也包含內建的嵌 入式Tomcat,正是使用它,才能釋出服務和訪問Web資源。除了我們編寫的原始碼所編譯形成的CLASS以外,在org目錄下還有許多Spring所提 供的CLASS,正是依賴這些CLASS,才能夠載入位於lib目錄下JAR中的類。這樣的載入機制與在OSGi bundle中宣告Bundle-Classpath很類似,不過在OSGi中會由容器來負責載入指定路徑下的類。這大致闡述了這樣一個JAR包能夠釋出 服務的原因。

如果我們想要使用HTML、JSP等Web資源的話,在Controller中直接返回對應的檢視就可以了。

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

Hellowebxml 程式碼  收藏程式碼
  1. public class HelloWebXml extends SpringBootServletInitializer {  
  2.     @Override  
  3.     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {  
  4.         return application.sources(Application.class);  
  5.     }  
  6. }  

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

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

Pom.xml程式碼  收藏程式碼
  1. <dependency>  
  2.             <groupId>org.springframework.boot</groupId>  
  3.             <artifactId>spring-boot-starter-web</artifactId>   
  4.            <exclusions>  
  5.             <exclusion>  
  6.                 <groupId>org.springframework.boot</groupId>  
  7.                 <artifactId>spring-boot-starter-tomcat</artifactId>  
  8.             </exclusion>  
  9.            </exclusions>   
  10. </dependency>  

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

Pom.xml程式碼  收藏程式碼
  1. <dependency>  
  2.             <groupId>org.apache.tomcat</groupId>  
  3.             <artifactId>tomcat-servlet-api</artifactId>  
  4.             <version>7.0.42</version>  
  5.             <scope>provided</scope>  
  6. </dependency>  

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

以上介紹了基於Spring Boot開發應用的過程,目前它的文件尚不完善,但是在GitHub上有不少的樣例,包括與Spring Data整合訪問資料庫(關係型以及非關係型)、安全、WebSocket等,讀者感興趣可以下載執行。

基於以上的介紹,希望讀者能夠對Spring Boot這個新專案有所瞭解。它簡化了JAR包管理和相關基礎設施環境的配置,能夠幫助我們快速開發Web應用或構建REST服務,希望它能夠儘快完善成熟,更多地用於實踐,提升開發效率。