Spring Boot war包&jar包對比


使用 Maven對SpringBoot程序進行打包處理有兩種格式:
一種是war包,一種是jar包。

雖然我們將springboot應用打包成了war包,但是我們依然可以使用 java -jar的方式來運行。

如何將應用打包成war包:
1、將pom.xml文件中的打包方式改為 :<packaging>war</packaging>
2、然后添加一個類,這個類繼承 SpringBootServletInitializer 類,並且重寫了里面的 configure() 方法。

package com.thunisoft.eurekaserver;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ApplicationWebStarter extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(EurekaserverApplication.class);
    }
}

  

然后可以直接使用 maven 去打包應用,這一點沒有區別。

 

下面我們就來研究一下這兩種打包方式,產出的文件結構有什么不同;

1、首先看一下打包成war包的方式:

文件夾 PATH 列表
卷序列號為 CE2F-63AD
C:\USERS\ADMINISTRATOR\DESKTOP\EUREKA-WAR
├─META-INF
│  │  MANIFEST.MF
│  │  
│  └─maven
│      └─com.thunisoft
│          └─eurekaserver
│                  pom.properties
│                  pom.xml
│                  
├─org
│  └─springframework
│      └─boot
│          └─loader
│              │  ExecutableArchiveLauncher$1.class
│              │  ExecutableArchiveLauncher.class
│              │  ......
│              │  ......
│              │  WarLauncher.class
│              │  
│              ├─archive
│              │      Archive$Entry.class
│              │      Archive$EntryFilter.class
│              │      ......
│              │      ......
│              │      JarFileArchive.class
│              │      
│              ├─data
│              │      ByteArrayRandomAccessData.class
│              │      ......
│              │      ......
│              │      RandomAccessDataFile.class
│              │      
│              ├─jar
│              │      AsciiBytes.class
│              │      Bytes.class
│              │      CentralDirectoryEndRecord.class
│              │      ......
│              │      ......
│              │      CentralDirectoryVisitor.class
│              │      FileHeader.class
│              │      
│              └─util
│                      SystemPropertyUtils.class
│                      
└─WEB-INF
    ├─classes
    │  │  application.yml
    │  │  bootstrap.yml
    │  │  
    │  └─com
    │      └─thunisoft
    │          └─eurekaserver
    │                  ApplicationWebStarter.class
    │                  EurekaserverApplication.class
    │                  
    └─lib
            antlr-2.7.7.jar
            antlr-runtime-3.4.jar
            ......
			......
			......
			aopalliance-1.0.jar
            archaius-core-0.7.4.jar

  


2、然后我們看一下jar包的打包目錄

文件夾 PATH 列表
卷序列號為 CE2F-63AD
C:\USERS\ADMINISTRATOR\DESKTOP\EUREKA-JAR
├─BOOT-INF
│  ├─classes
│  │  │  application.yml
│  │  │  
│  │  └─com
│  │      └─thunisoft
│  │          └─eurekaserver
│  │                  EurekaserverApplication.class
│  │                  
│  └─lib
│          antlr-2.7.7.jar
│          antlr-runtime-3.4.jar
│          aopalliance-1.0.jar
│          ......
│          ......
│          ......
│          classmate-1.3.4.jar
│          commons-codec-1.10.jar
│          commons-collections-3.2.2.jar
│          
├─META-INF
│  │  MANIFEST.MF
│  │  
│  └─maven
│      └─com.thunisoft
│          └─eurekaserver
│                  pom.properties
│                  pom.xml
│                  
└─org
    └─springframework
        └─boot
            └─loader
                │  ExecutableArchiveLauncher$1.class
                │  ExecutableArchiveLauncher.class
                │  ......
                │  ......
                │  PropertiesLauncher.class
                │  WarLauncher.class
                │  
                ├─archive
                │      Archive$Entry.class
                │      Archive$EntryFilter.class
                │      ......
                │      ......
                │      JarFileArchive.class
                │      
                ├─data
                │      ByteArrayRandomAccessData.class
                │      RandomAccessData$ResourceAccess.class
                │      ......
                │      ......
                │      RandomAccessDataFile$FilePool.class
                │      RandomAccessDataFile.class
                │      
                ├─jar
                │      AsciiBytes.class
                │      Bytes.class
                │      CentralDirectoryEndRecord.class
                │      ......
                │      ......
                │      ......
                │      FileHeader.class
                │      JarURLConnection.class
                │      ZipInflaterInputStream.class
                │      
                └─util
                        SystemPropertyUtils.class

  

3、對比
對比之后我們發現,其實這兩中打包方式解壓后的目錄結構大體上是相似的。
不同點:
1、首先如果是jar包,一般是這樣三個目錄: META-INF org BOOT-INF
2、war包的結構是,會將上面的 BOOT-INF 目錄名 換成 WEB-INF
3、相對於jar包,war包里面會多出一個類SpringBootServletInitializer,這個類的存在就可以讓我們把打包出的war包放入tomcat等一系列的容器中運行。

將jar包改為war包其實很容易,只需要更改BOOT-INF 為 WEB-INF,然后添加一個啟動類,SpringBootServletInitializer,這樣就可以直接將war包扔進容器中運行了,當然也可以使用jar -jar方式運行,但是里面的main方法是要存在的,不然只能放在容器中運行,不能使用命令行運行。
所以綜上所述,使用war包比使用jar要更加方便,因為war可以有兩種部署方式。


免責聲明!

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



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