您的位置 首页 java

Spring 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文件)

我们可以看到解压的目录下有三个子目录: 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镜像

META-INF

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

org

Spring Boot Loader的classes

探索 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
  • jar Launcher 的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()) {
         Jar File .registerUrl Protocol Handler(); 
     }
     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 启动应用。

文章来源:智云一二三科技

文章标题:Spring Boot独立运行的jar包是如何工作的

文章地址:https://www.zhihuclub.com/192189.shtml

关于作者: 智云科技

热门文章

网站地图