如何阻止Spring Boot加载application.properties,改用自定义配置?
Spring Boot迁移外部化配置时强制加载application.properties问题
问题描述
迁移旧Spring Boot服务到外部化配置时出现异常:即便指定了profile,本地和服务器端的服务仍会尝试加载application.properties,因文件不存在导致启动失败。尝试通过System.setProperty("spring.config.name", getPropertiesPath())强制指定配置文件名,但无效,且不想采用这种方式。
异常摘要
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mydomain.Application]; nested exception is java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist
修改后的Application.java代码
@SpringBootApplication public class Application { protected static final String CONTAINER_ENVIRONMENT_KEY = "ENVIRONMENT"; private static final String CDS_SERVICE_CHARTS_PROPERTIES_PATH = "server.properties"; private static final String APPLICATION_LOCAL_PROPERTIES_PATH = "application-local.properties"; public static void main(String[] args) { System.setProperty("spring.config.name", getPropertiesPath()); SpringApplication.run(Application.class, args); } protected static String getPropertiesPath() { return StringUtils.isBlank(System.getenv(CONTAINER_ENVIRONMENT_KEY)) ? APPLICATION_LOCAL_PROPERTIES_PATH : CDS_SERVICE_CHARTS_PROPERTIES_PATH; } }
排查情况
- 已查阅Spring Boot配置加载顺序相关内容,除测试用配置外未使用其他配置
- 代码中完全未引用
application.properties - 怀疑是依赖库导致问题,但无法定位具体原因
- 其他服务采用相同外部化配置流程,未出现此问题
完整异常栈
2023-03-30T17:02:23,073 INFO [main] 637:Application : The following 1 profile is active: "local" 2023-03-30T17:02:26,586 WARN [main] 591:AnnotationConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mydomain.Application]; nested exception is java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist 2023-03-30T17:02:26,848 ERROR [main] 821:SpringApplication : Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mydomain.Application]; nested exception is java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.7.jar:2.7.7] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) [spring-boot-2.7.7.jar:2.7.7] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) [spring-boot-2.7.7.jar:2.7.7] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.7.7.jar:2.7.7] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) [spring-boot-2.7.7.jar:2.7.7] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) [spring-boot-2.7.7.jar:2.7.7] at com.mydomain.Application.main(Application.java:22) [classes/:?] Caused by: java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:199) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:159) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:110) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:81) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(PropertiesLoaderUtils.java:67) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.core.io.support.ResourcePropertySource.<init>(ResourcePropertySource.java:67) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.core.io.support.DefaultPropertySourceFactory.createPropertySource(DefaultPropertySourceFactory.java:37) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:462) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:279) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:303) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:303) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) ~[spring-context-5.3.24.jar:5.3.24] ... 13 more Disconnected from the target VM, address: '127.0.0.1:59414', transport: 'socket'
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

