整体过程
- Spring Boot打包插件将启动类设为org.springframework.boot.loader.JarLauncher;
- 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 启动过程
- 注册Jar URL扩展协议处理器Handler;
- 创建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 });
}
参考: