Spring Boot v1.5.12类路径Spring Resource文件加载变更原因咨询
spring.cloud.gcp.credentials.location需要加classpath:前缀? 这个问题的核心原因是Spring Cloud GCP依赖版本的升级带来的路径解析逻辑变更,而Spring Boot 1.5.12刚好同步了这个依赖的更新,具体可以拆成两个关键点来看:
Spring Cloud GCP凭证加载逻辑的严格化
在1.0.0.RELEASE版本之前(对应Spring Boot 1.5.11及更早的配套依赖),Spring Cloud GCP的CredentialsProvider实现会自动兜底在类路径(classpath)中查找未指定前缀的文件路径。也就是说,当你配置spring.cloud.gcp.credentials.location=auth.json时,它会先去src/main/resources(编译后属于classpath目录)里找这个文件,找不到再尝试文件系统路径。但在1.0.0.RELEASE及之后的版本(Spring Boot 1.5.12开始引入该稳定版),团队调整了这个逻辑,严格遵循Spring的标准资源定位规则:未加前缀的路径默认被解析为文件系统的绝对/相对路径,不再自动去classpath中查找。因此直接写
auth.json会被当作当前工作目录下的文件,自然找不到src/main/resources里的编译后文件,触发FileNotFound异常。Spring Boot 1.5.12的依赖版本同步
Spring Boot 1.5.12升级了其依赖的Spring Cloud GCP版本到正式稳定版,这个版本刚好包含了上述的路径解析逻辑变更。而之前的Spring Boot 1.5.11使用的是Spring Cloud GCP的早期里程碑版本,还保留了自动查找classpath的宽松逻辑。
简单来说,就是之前的版本是"贴心兜底"模式,帮你自动查classpath;现在变成"严格规范"模式,必须明确用classpath:前缀指定类路径资源,和Spring加载其他配置文件、静态资源的规则保持一致。
内容的提问来源于stack exchange,提问作者Steven

