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

原文地址:https://www.cnblogs.com/hfultrastrong/p/8567003.html