你知道吗,java -jar是在哪里开始启动项目的?

在这里插入图片描述


SpringBoot打包的jar分析,java -jar是在哪里开始启动项目的?

一般情况下来说,在pom文件中没有指定layout的默认值为:JAR

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!-- 省略.... -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--<layout>ZIP</layout>-->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

官方定义有5种见:org.springframework.boot.maven.AbstractPackagerMojo.LayoutType

public enum LayoutType {
    JAR(new Jar()),
    WAR(new War()),
    ZIP(new Expanded()),
    DIR(new Expanded()),
    NONE(new None());
    // 省略...
}
名称启动类
JARorg.springframework.boot.loader.JarLauncher
WARorg.springframework.boot.loader.WarLauncher
ZIPorg.springframework.boot.loader.PropertiesLauncher
DIRorg.springframework.boot.loader.PropertiesLauncher
NONE项目本身入口类

把jar解压有3个文件夹:

BOOT-INF:这个是我们自己写的编译后的class文件

META-INF:相当于描述文件,里面包含了项目的pom文件、项目版本信息以及MANIFEST.MF描述文件

org:jar包运行的入口程序 => spring-boot-load项目的编译后的class文件


MANIFEST.MF
值(以下值为举例)描述
Manifest-Version1.0版本
Spring-Boot-Classpath-IndexBOOT-INF/classpath.idx内容是项目中用到依赖,一般是BOOT-INF/lib下jar的相对路径
Implementation-Titledemo项目名称,对应pom文件的name标签
Implementation-Version1.0.0项目版本,对应pom文件的version标签
Spring-Boot-Layers-IndexBOOT-INF/layers.idx内容也是一些项目相关的路径信息
Start-Classcom.example.demo.DemoApplication项目启动类路径
Spring-Boot-ClassesBOOT-INF/classes/项目编译后的class文件路径
Spring-Boot-LibBOOT-INF/lib/项目所引用的依赖包的路径
Build-Jdk-Spec1.8jdk版本
Spring-Boot-Version2.3.10.RELEASEspringboot版本
Created-ByMaven Jar Plugin 3.2.0maven jar plugin信息
Main-Classorg.springframework.boot.loader.JarLauncherjava -jar启动的入口类

以下我们可以分析一下,不同layout的jar包的MANIFEST.MF是怎么描述的:

1. JAR(默认)
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 1.0.0
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.3.10.RELEASE
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher
2. ZIP(或者: DIR)
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 1.0.0
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.3
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.PropertiesLauncher
3. NONE
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 1.0.0
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.3
Created-By: Maven Jar Plugin 3.2.0
Main-Class: com.example.demo.DemoApplication

注:这种方式打包出来的jar,是不会包含org文件夹,也就是没有spring-boot-load项目的编译后的class文件

4. WAR
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: WEB-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 1.0.1
Spring-Boot-Layers-Index: WEB-INF/layers.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.3
Created-By: Maven WAR Plugin 3.3.1
Main-Class: org.springframework.boot.loader.WarLauncher
总结

对接上述4个描述文件,

JAR、ZIP、DIR:这三个文件后缀为:.jar,启动类分别是:JarLanucher、PropertiesLauncher

WAR:文件后缀为:.war,启动类为:WarLanucher。并且一些文件目录名字以WEB开头

NONE:文件后缀为:.jar,启动类为项目本身入口


java -jar 方式运行项目一般都是从Main-Class配置的类开始的,通过spring-boot-load项目去加载真实项目的class文件、配置文件等,根据Start-Class配置的类去启动真实的项目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值