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