spring boot中,jar包、war包的區別


  • jar包、war包 比較(表格)
項目 jar包 war包
  • 在開發調試完成之后,可以將應用打成JAR包的形式,可以直接使用Maven插件的package命令,最終會形成一個可運行的 JAR包。我們使用java –jar命令就可以運行這個JAR包了。

  • 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應用上下文,此時我們需要聲明這樣一個類:

public class HelloWebXml extends SpringBootServletInitializer {  
    @Override  
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {  
        return application.sources(Application.class);  
    }    
}  

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

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

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

<dependency>  
            <groupId>org.apache.tomcat</groupId>  
            <artifactId>tomcat-servlet-api</artifactId>  
            <version>7.0.42</version>  
            <scope>provided</scope>  
</dependency>  

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM