代理启动Launcher

整体过程

  1. Spring Boot打包插件将启动类设为org.springframework.boot.loader.JarLauncher;
  2. JarLauncher内部通过反射调用应用程序入口类,启动应用;

Launcher类体系

这里写图片描述
JarLauncher 、WarLauncher 、PropertiesLauncher代表了Spring Boot的三种代理启动方式。

Step1: 修改启动类

  Spring Boot打包插件生成可执行Jar时,在MANIFEST.MF中将启动类设为JarLauncher,如下所示:

Manifest-Version: 1.0
Start-Class: com.manerfan.springboot.theory.WebApp
Main-Class: org.springframework.boot.loader.JarLauncher

Step2: JarLauncher启动

2.1 创建JarLauncher实例,调用启动方法launch

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

2.2 启动过程

  1. 注册Jar URL扩展协议处理器Handler;
  2. 创建ClassLoader(绑定当前Jar及嵌套Jar的URL);
protected void launch(String[] args) throws Exception {
        JarFile.registerUrlProtocolHandler();
        ClassLoader classLoader = createClassLoader(getClassPathArchives());
        launch(args, getMainClass(), classLoader);
    }

2.3 启动应用程序

  利用上述ClassLoader加载应用程序的启动类,通过发射调用main方法,启动应用程序,如下所示:

public void run() throws Exception {
        Class<?> mainClass = Thread.currentThread().getContextClassLoader()
                .loadClass(this.mainClassName);
        Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
        mainMethod.invoke(null, new Object[] { this.args });
    }

参考:

  1. https://segmentfault.com/a/1190000013532009

猜你喜欢

转载自blog.csdn.net/yangguosb/article/details/80770505