我有 Spring Boot 应用程序,我有 3 个属性文件:applications.properties, applications-dev.properties, applicaton-prod.properties
. 在applications.properties
我指定的spring.profiles.active=prod
. 但我想允许在没有 prod profile( applicaton-prod.properties
) 的情况下启动应用程序。这意味着 spring 必须在 dev profile( applications-dev.properties
) 中自动启动应用程序。我该如何实施?可能存在一些MissingOnProfile
注释吗?)我的任务是根据 application.properties 文件创建不同的应用程序行为。@Profile
我也在每个依赖于特定配置文件的 bean 中使用注释。所有任务都是创建 WebInstaller,在完成步骤中我将创建 application-prod.properties 并通过使用RestartEndpoint
我将重新启动应用程序上下文并application-prod.properties
注入所需的 bean。但我需要在没有的情况下启动application-prod.properties
,但如果此文件存在,我将在 prod 配置文件中启动。
4 回答
您将配置文件信息设置在错误的位置。该文件application.properties
包含所有配置文件(dev、stage、prod 等)共有的属性。对于配置文件,您应该按照您的建议创建一个名称文件,该文件application-{profile}.properties
将根据 variable 定义的环境覆盖某些属性profile
。
通常的方法是将此变量作为参数传递给 JVM(例如:)-Dprofile=dev
,如果您从 IDE 启动,您可以通过修改 servlet 容器的运行配置来设置。如果是独立的 tomcat,您可以通过JAVA_OPTIONS
文件中的变量传递此信息setenv.sh
。
你可以这样做:
SpringApplication application = new SpringApplication(IdMatrixApplication.class);
File file = new File("src/main/resources/dev/application-prod.properties");
if (file.exists()) {
application.setAdditionalProfiles("prod","dev");
}
application.run(args);
如果您需要手动实现某种业务逻辑,例如,默认情况下指定活动配置文件prod
- 在
application.properties
定义中spring.profiles.active=prod
例如,如果application-prod.properties
缺少 ,那么活动配置文件应该是dev
,您可以使用以下方式实现EnvironmentPostProcessor
:
允许在刷新应用程序上下文之前自定义应用程序的环境
EnvironmentPostProcessor
使用您的业务逻辑实施public class ProfileResolverEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { ClassPathResource prodPropertiesResource = new ClassPathResource("application-prod.properties"); // if "application-prod.properties" missing and "prod" profile active if (!prodPropertiesResource.exists() && environment.acceptsProfiles("prod")) { environment.setActiveProfiles("dev"); //environment.addActiveProfile("dev"); } } }
在中注册您的
EnvironmentPostProcessor
实现类META-INF/spring.factories
org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.ProfileResolverEnvironmentPostProcessor
另外,请查看 Spring Boot 文档自定义环境
额外的:
当然,如果配置文件丢失,您可以指定将处于活动状态的 bean@Profile("!prod")
但是如果您定义,这在您的情况下不起作用spring.profiles.active=prod
,因为活动配置文件prod
将在中,但与丢失Environment
的事实无关application-prod.properties
如果你想要这个,那么你为什么需要application-dev.properties
. 将您的开发属性保存在application.properties
. 如果配置文件设置,则applicatoin.properties
值将被覆盖。如果配置文件处于活动状态, Spring Boot 会同时读取application.properties
&&application.yml
和替换值