spring.config.location无classpath资源时抛异常?@PropertySource相关疑问
这确实是Spring的预期行为,我来给你拆解下背后的逻辑:
为什么会抛出FileNotFoundException?
@PropertySource注解的默认行为是强制要求指定的资源必须存在——不管你后续会不会用外部配置覆盖这些属性,Spring在初始化配置类的时候,都会尝试加载你在@PropertySource里指定的classpath资源。如果这个资源找不到,就会直接抛出FileNotFoundException,中断应用启动。
而你用java -jar app.jar spring.config.location=path-to-external-property-file指定的外部配置,属于Spring Boot的外部配置加载机制,它的优先级确实高于classpath内的配置,但这个逻辑是在@PropertySource加载之后才生效的——也就是说,Spring先尝试加载@PropertySource指定的资源,失败了就直接报错,根本没走到外部配置生效的阶段。
你的解决方案是正确的
你通过设置ignoreResourceNotFound = true来解决问题,完全符合需求:
@Configuration @PropertySource(value = "classpath:conf/agent.properties", ignoreResourceNotFound = true) public class AppConfig { // 配置内容 }
这个属性会告诉Spring:如果指定的classpath资源不存在,就忽略这个加载失败,继续启动应用。这时候你的外部配置就能正常生效,完全满足“仅使用外部配置,不因classpath资源缺失停止运行”的要求。
额外补充
如果你的配置类需要加载多个配置源,还可以用@PropertySources组合多个@PropertySource注解,给每个源单独设置ignoreResourceNotFound属性,灵活控制哪些资源是可选的,哪些是必须存在的。
内容的提问来源于stack exchange,提问作者java_dev

