前景:spring-boot 多模块应用开发,工具模块在主模块中引用(jar包形式),出现工具模块配置读取异常问题。
例如:XXX-Center 主业务模块,引用XXX-SDK模块。
建议:工具模块中不要命名启动项默认配置文件名称
如上图:sdk为工具包,如果sdk中配置文件命名application.properties,center中也存在application.properties,那么SDK中使用Settings等静态加载配置的方式,则会拿不到配置。
解决方法就是在作为工具包的模块中,不要以用SpringBoot默认读取的配置文件名命名
原理:
以Hutool 工具Setting读取机制为例:
1、JAVA的三种类加载机制这里就不说了,百度一下。获取配置的时候,会取当前线程(上下文)的类加载器,AppClassLoader为类加载器对象,获取类加载器的资源,如下图。点进去,发现是个递归方法,会向上找巡BootStrap的资源。找到了就返回。
2、而主应用的配置问价加载优先级,是高于sdk等依赖的配置文件加载级别。因此这里首先会找寻到应用的application.properties。此时拿到的了配置,但是是主应用的,因此也就造就了sdk工具包配置读取失败问题。
3、如果主应用没有配置application.properties,那么这里拿到的就是sdk的配置文件。因为此时加载到资源的配置,就是sdk的application.properties.
4、那么对sdk的配置文件重命名后又是怎么读取的?重命名,不以默认读取名命名,当前app,Bootsrap资源都找不到配置文件,这时,会进入findResource方法。此方法会进入URLClassLoader类中,执行根据入参名,搜索加载的所有地址资源。