springboot jar包启动流程:
springbot在通过pom.xml配置的spring-boot-maven-plugin的repackage打包成一个fat jar包,打包的jar里面有BOOT-INF,这个目录里包含很多第三方依赖jar包,还有自己写的class文件,还有一个目录是MATA-INF,这里有MANIFEST文件,文件里我们自己写的应用启动类application,还有一个最重要的main-class,主函数是JarLauncher类,这个类也是main函数启动,源码中是创建一个 JarLauncher的无参构造函数,然后调用父类(ExecutableArchiveLauncher)的launch方法,以fat jar为参数传入,launch方法会生成一个LaunchedUrlClassLoader来会加载BOOT-INF里的jar包,然后启动我们自己写的应用启动类。
springboot IDE启动流程:
ide启动的时候会把jar包全部放到classpath中,所以springboot项目直接启动main函数就行。
总结:
JarLauncher通过加载BOOT-INF/classes目录及BOOT-INF/lib目录下jar文件,实现了fat jar的启动。
SpringBoot通过扩展JarFile、JarURLConnection及URLStreamHandler,实现了jar in jar中资源的加载。
SpringBoot通过扩展URLClassLoader–LauncherURLClassLoader,实现了jar in jar中class文件的加载。
WarLauncher通过加载WEB-INF/classes目录及WEB-INF/lib和WEB-INF/lib-provided目录下的jar文件,实现了war文 件的直接启动及web容器中的启动。