指定java -jar命令来执行一个jar文件的时候的流程

我们可以通过maven build来把一个springboot项目打包成一个jar文件,然后 用java -jar jar文件名的方式启动这个项目,这个jar文件是个压缩文件,解压后有三个根目录:

BOOT-INF:下面有两个子目录,分别是lib和classes,lib里面是第三方依赖的jar包,classes里面是项目里面的类信息

META-INF:里面有一个清单文件MANIFEST.MF文件,里面有两个重要的属性1,Main-Class,属性值是启动类,2,Start-Class,属性值是启动类,(被我们用springbootapplication标注的类)

org:是spring.boot.loader这个jar包里的所有内容,上面的Main-Class就是位于这个jar包里,包名,类名位于顶层目录

当我们执行java -jar启动后:

1,找到META-INF下面的MANIFEST.MF文件里的Main-Class的属性值。也就是org.springframework.boot.loader.JarLauncher,这是一个用于jar这种归档文件的启动器,它的直接父类是ExecutableArchiveLauncher类,这个父类有两个子类,另一个是WarLauncher,然后会执行里面一个入口方法,也就是main方法

2,main方法里创建了一个JarLauncher实例,并执行了它的一个launch方法,这个方法位于父类Launcher类中,通过一个getClassPathArchives方法获取到我们执行的那个jar归档文件

3,然后通过getNestedArchives方法获取到boot-inf里面的第三方jar包和项目中的信息,也就是嵌套的jar文件,随后创建一个LaunedURLClassloader,把Launcher这个类的类加载器作为它的父类加载器,并且把线程上下文类加载器设置成该类加载器,这个类加载器是springboot自定义的类加载器,用于加载jdk提供的类加载器所加载不到的被嵌套的jar文件和项目类信息,

4,拿到Start-class的属性值,也就是我们自己定义的springbootapplication的启动类,用这个类加载器去加载这个启动类, 接下来通过反射的方式去执行main方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值