正常情况下classloader只能找到jar里面当前目录或者文件类里面的*.class文件。为了能够加载嵌套jar里面的资源之前都是把嵌套jar里面的class文件和应用的class文件打包为一个jar,这样就不存在嵌套jar了,但是这样做就不能很清晰的知道应用到底依赖了哪些东西,哪些是应用自己的,另外多个jar里面的class可能内容不一样但是文件名却一样。springboot中spring-boot-loader就是为优雅解决这个问题而诞生的。spring-boot-loader模块允许我们使用java -jar archive.jar运行包含嵌套依赖jar的jar或者war文件,它提供了三种类启动器 ,这些类启动器的目的一样都是为了能够加载嵌套在jar里面的资源。[Jar|War]Launcher固定去查找当前jar的lib目录里面的嵌套jar文件里面的资源。所以在打包时候拷贝本来应该放入到lib里面的spring-boot-loader.jar里面的class到结构。

浅析Spring Boot中的spring-boot-load模块

浅析Spring Boot中的spring-boot-load模块