Spring 如果产品配置文件不存在,引导 2 使用开发配置文件
Spring Boot 2 use dev profile if prod profile is not exist
我有 Spring 个启动应用程序,我有 3 个 属性 个文件:applications.properties, applications-dev.properties, applicaton-prod.properties
。在 applications.properties
中,我指定 spring.profiles.active=prod
。但是我想允许在没有产品配置文件(applicaton-prod.properties
)的情况下启动应用程序。这意味着 spring 必须自动启动开发配置文件 (applications-dev.properties
) 中的应用程序。我该如何实施?可能存在一些 MissingOnProfile
注释?)我的任务是根据 application.properties 文件创建不同的应用程序行为。我还根据特定配置文件在每个 bean 中使用 @Profile
注释。所有任务都是创建 WebInstaller,在完成步骤中我将创建 application-prod.properties 并通过使用 RestartEndpoint
我将重新启动应用程序上下文,并且将注入来自 application-prod.properties
的所需 bean。但我需要在没有 application-prod.properties
的情况下启动,但如果此文件存在,我将在产品配置文件中启动。
您在错误的位置设置了个人资料信息。文件 application.properties
包含所有配置文件(dev、stage、prod 等)共有的属性。对于配置文件,您应该按照您的建议创建一个名为 application-{profile}.properties
的文件,该文件将根据变量 profile
.
定义的环境覆盖某些属性
通常的方法是将这个变量作为参数传递给 JVM(例如:-Dprofile=dev
),如果您从一个 IDE。如果是独立 tomcat,您可以通过文件 setenv.sh
中的 JAVA_OPTIONS
变量传递此信息。
如果你想要这个,那你为什么需要 application-dev.properties
。将您的开发属性保留在 application.properties
中。如果设置了配置文件,则 applicatoin.properties
值将被覆盖。 Spring 引导读取 application.properties
&& application.yml
并在配置文件处于活动状态时替换值
如果您需要使用配置文件手动实现某种业务逻辑,例如,默认指定活动配置文件prod
- 在
application.properties
中定义spring.profiles.active=prod
例如,如果缺少 application-prod.properties
,则活动配置文件应为 dev
,您可以使用 EnvironmentPostProcessor
:
来实现
Allows for customization of the application's Environment prior to the application context being refreshed
使用您的业务逻辑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");
}
}
}
在 META-INF/spring.factories
中注册您的 EnvironmentPostProcessor
实现 class
org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.ProfileResolverEnvironmentPostProcessor
Also, take look at Spring Boot documentation Customize the
Environment
附加:
当然,您可以指定在配置文件丢失时将处于活动状态的 bean @Profile("!prod")
但是,如果您定义 spring.profiles.active=prod
,这在您的情况下不起作用,因为活动配置文件 prod
将在 Environment
中,但它与 application-prod.properties
这一事实无关] 不见了
你可以这样做:
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);
我有 Spring 个启动应用程序,我有 3 个 属性 个文件:applications.properties, applications-dev.properties, applicaton-prod.properties
。在 applications.properties
中,我指定 spring.profiles.active=prod
。但是我想允许在没有产品配置文件(applicaton-prod.properties
)的情况下启动应用程序。这意味着 spring 必须自动启动开发配置文件 (applications-dev.properties
) 中的应用程序。我该如何实施?可能存在一些 MissingOnProfile
注释?)我的任务是根据 application.properties 文件创建不同的应用程序行为。我还根据特定配置文件在每个 bean 中使用 @Profile
注释。所有任务都是创建 WebInstaller,在完成步骤中我将创建 application-prod.properties 并通过使用 RestartEndpoint
我将重新启动应用程序上下文,并且将注入来自 application-prod.properties
的所需 bean。但我需要在没有 application-prod.properties
的情况下启动,但如果此文件存在,我将在产品配置文件中启动。
您在错误的位置设置了个人资料信息。文件 application.properties
包含所有配置文件(dev、stage、prod 等)共有的属性。对于配置文件,您应该按照您的建议创建一个名为 application-{profile}.properties
的文件,该文件将根据变量 profile
.
通常的方法是将这个变量作为参数传递给 JVM(例如:-Dprofile=dev
),如果您从一个 IDE。如果是独立 tomcat,您可以通过文件 setenv.sh
中的 JAVA_OPTIONS
变量传递此信息。
如果你想要这个,那你为什么需要 application-dev.properties
。将您的开发属性保留在 application.properties
中。如果设置了配置文件,则 applicatoin.properties
值将被覆盖。 Spring 引导读取 application.properties
&& application.yml
并在配置文件处于活动状态时替换值
如果您需要使用配置文件手动实现某种业务逻辑,例如,默认指定活动配置文件prod
- 在
application.properties
中定义spring.profiles.active=prod
例如,如果缺少 application-prod.properties
,则活动配置文件应为 dev
,您可以使用 EnvironmentPostProcessor
:
Allows for customization of the application's Environment prior to the application context being refreshed
使用您的业务逻辑
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"); } } }
在
META-INF/spring.factories
中注册您的
EnvironmentPostProcessor
实现 class
org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.ProfileResolverEnvironmentPostProcessor
Also, take look at Spring Boot documentation Customize the Environment
附加:
当然,您可以指定在配置文件丢失时将处于活动状态的 bean @Profile("!prod")
但是,如果您定义 spring.profiles.active=prod
,这在您的情况下不起作用,因为活动配置文件 prod
将在 Environment
中,但它与 application-prod.properties
这一事实无关] 不见了
你可以这样做:
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);