怎么看springbootjar包内容(Boot独立运行的jar包是如何工作的)

spring Boot使用Spring Boot Gradle Plugin或者Spring Boot Maven Plugin将程序打包成可以独立运行的jar包的。

Spring Boot使用Spring Boot Loader通过java -jar来启动Jar包。

我们来解压一下Spring Boot的jar包(jar其实是一个zip文件)

怎么看springbootjar包内容(Boot独立运行的jar包是如何工作的)(1)

我们可以看到解压的目录下有三个子目录:BOOT-INF,META-INF,org

example.jar | -META-INF | -MANIFEST.MF -org | -springframework | -boot | -loader | -<spring boot loader classes> -BOOT-INF -classes | -mycompany | -project | -YourClasses.class -lib -dependency1.jar -dependency2.jar

BOOT-INF

  1. BOOT-INF/classes: 应用程序的classes文件
  2. BOOT-INF/lib: 内嵌依赖包
  3. BOOT-INF/classpath.idx: jar包添加到classpath的顺序
  4. BOOT-INF/layers.idx: 允许将 jar 拆分为逻辑层以创建Docker/OCI镜像

怎么看springbootjar包内容(Boot独立运行的jar包是如何工作的)(2)

META-INF

META-INF/MANifEST.MF: 有关jar中包含的文件的信息

怎么看springbootjar包内容(Boot独立运行的jar包是如何工作的)(3)

org

Spring Boot Loader的classes

怎么看springbootjar包内容(Boot独立运行的jar包是如何工作的)(4)

探索Spring Boot的魔法

我们将通过一步一步的jar包启动步骤来分析这个过程:

  • java -jar
  • 在META-INF/MANIFEST.MF文件中寻找可执行jar包的入口类:

Manifest-Version: 1.0 Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: top.wisely.springasync.SpringAsyncApplication Spring-Boot-Version: 2.7.2 Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx Spring-Boot-Layers-Index: BOOT-INF/layers.idx

  • Main-Class: org.springframework.boot.loader.JarLauncher 是主入口类.
  • JarLauncher extends ExecutableArchiveLauncher 并且 ExecutableArchiveLauncher extends Launcher
  • jarLauncher 的main方法:

public class JarLauncher extends ExecutableArchiveLauncher { //... public static void main(String[] args) throws Exception { new JarLauncher().launch(args); } //... }

  • 所以真正的 launch(args) 方法在 Launcher 类中:

public abstract class Launcher { protected void launch(String[] args) throws Exception { if (!isExploded()) { JarFile.registerUrlProtocolHandler(); } ClassLoader classLoader = createClassLoader(getClassPathArchivesIterator()); //① String jarMode = System.getProperty("jarmode"); String launchClass = (jarMode != null && !jarMode.isEmpty()) ? JAR_MODE_LAUNCHER : getMainClass(); //② launch(args, launchClass, classLoader); //③ } }

① classLoader - 创建LaunchedURLClassLoader 实例. 所有的 BOOT-INF/classes 和 BOOT-INF/jar classes 都是由 LaunchedURLClassLoader 加载。

② launchClass - 从 META-INF/MANIFEST.MF 获取Start-Class。

③ 使用 args,launchClass,classLoader 启动应用。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页