当前位置: 首页 > 科技观察

SpringBoot独立运行的jar包是如何工作的

时间:2023-03-13 01:11:33 科技观察

SpringBoot使用SpringBootGradlePlugin或者SpringBootMavenPlugin将程序打包成可以独立运行的jar包。SpringBoot使用SpringBootLoader通过java-jar启动jar包。我们来解压SpringBoot的jar包(jar其实就是一个zip文件)。我们可以看到解压后的目录下有三个子目录:BOOT-INF、META-INF、orgexample.jar|+-元信息|+-MANIFEST.MF+-组织|+-弹簧框架|+-启动|+-装载机|+-+-BOOT-INF+-classes|+-我的公司|+-项目|+-YourClasses.class+-lib+-dependency1.jar+-dependency2.jarBOOT-INFBOOT-INF/classes:应用的classes文件BOOT-INF/lib:内嵌依赖包BOOT-INF/classpath.idx:jar包添加到类路径的顺序BOOT-INF/layers.idx:允许将jar拆分为逻辑层以创建Docker/OCI镜像META-INFMETA-INF/MANIFEST.MF:有关包含的文件的信息在jarorgSpringBootLoader类中探索SpringBoot的神奇之处我们将通过一步一步的jar包启动步骤来分析这个过程:java-jar在META-INF/中找到可执行jar包的入口类MANIFEST.MF文件:Manifest-Version:1.0Main-Class:org.springframework.boot。loader.JarLauncherStart-Class:top.wisely.springasync.SpringAsyncApplicationSpring-Boot-Version:2.7.2Spring-Boot-Classes:BOOT-INF/classes/Spring-Boot-Lib:BOOT-INF/lib/Spring-Boot-Classpath-索引:BOOT-INF/类spath.idxSpring-Boot-Layers-Index:BOOT-INF/layers.idxMain-Class:org.springframework.boot.loader.JarLauncher是主入口类.JarLauncherextendsExecutableArchiveLauncher并且ExecutableArchiveLauncherextendsLauncherJarLauncher的主要方法:publicclassJarLauncheriveextendsLauncher{//...publicstaticvoidmain(String[]args)throwsException{newJarLauncher().launch(args);}//...}所以真正的launch(args)方法在Launcher类中:publicabstractclassLauncher{protectedvoidlaunch(String[]args)throwsException{if(!isExploded()){JarFile.registerUrlProtocolHandler();}ClassLoaderclassLoader=createClassLoader(getClassPathArchivesIterator());//①StringjarMode=System.getProperty("jarmode");字符串launchClass=(jarMode!=null&&!jarMode.isEmpty())?JAR_MODE_LAUNCHER:getMainClass();//②launch(args,launchClass,classLoader);//③}}①classLoader-创建LaunchedURLClassLoader实例。所有的BOOT-INF/classes和BOOT-INF/jarclasses都是由LaunchedURLClassLoader加载的②launchClass-从META-INF/MANIFEST.MF中获取Start-Class。③使用args、launchClass、classLoader启动应用。文章来自:热爱科学的卫斯理,如需转载本文,请即日联系热爱科学的卫斯理头条号。