指定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方法

发布了33 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gml0000/article/details/105334331