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

  1. 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

  1. 使用您的业务逻辑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");
        }
    }
    
    }
    
  2. META-INF/spring.factories

  3. 中注册您的 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);