上圖為一個由Luyten工具反編譯后的一個jar包
說明:
SpringBoot提供的bootstrap的類是放到包的最外面,比如上面的org.springframework.boot.loader。
應用程序的代碼則是需要放到BOOT-INF/classes目錄下面;然后應用程序依賴的其他的jar包文件需要放到BOOT-INF/lib目錄下。
當這個jar作為standardalone的程序運行時(沒有放到container),SpringBoot會在生成的META-INF/MANIFEST.MF里面將Main-Class設置成org.springframework.boot.loader.JarLauncher,JarLauncher類會創建一個spring自己的ClassLoader: LaunchedURLClassLoader, 這個classloader 會就能通過URL來加載上面BOOT-INF/lib里面所依賴的包,並且通過反射Manifest里面的Start-Class里面定義的類,然后invoke這個類里面的main方法。