使用 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可以有兩種部署方式。