java规范:入口main文件,必须为jar顶层目录
protected void launch(String[] args, String launchClass, ClassLoader classLoader) throws Exception {
//用创建的classloader替换
Thread.currentThread().setContextClassLoader(classLoader);
this.createMainMethodRunner(launchClass, args, classLoader).run();
}
run方法点进去
public void run() throws Exception {
//mainClassName 就是springboot启动类
Class<?> mainClass = Class.forName(this.mainClassName, false, Thread.currentThread().getContextClassLoader());
//反射启动main方法
Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
mainMethod.setAccessible(true);
mainMethod.invoke((Object)null, this.args);
}
JDWP java远程调试协议(不管是是什么环境启动)
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5050 -jar demo-0.0.1-SNAPSHOT.jar
LaunchedURLClassLoader 最后继承了Lancher 所以最终是系统加载器加载。