【问题标题】:Spring Boot 2 use dev profile if prod profile is not exist如果 prod 配置文件不存在,Spring Boot 2 使用 dev 配置文件
【发布时间】:2019-01-06 14:52:42
【问题描述】:

我有 Spring Boot 应用程序,我有 3 个属性文件:applications.properties, applications-dev.properties, applicaton-prod.properties。在applications.properties 中,我指定spring.profiles.active=prod。但我想允许在没有产品配置文件的情况下启动应用程序(applicaton-prod.properties)。这意味着 spring 必须在 dev profile(applications-dev.properties) 中自动启动应用程序。我该如何实施?可能存在一些MissingOnProfile 注释?)我的任务是根据application.properties 文件创建不同的应用程序行为。我还在每个依赖于特定配置文件的 bean 中使用 @Profile 注释。所有任务都是创建 WebInstaller,在完成步骤中我将创建 application-prod.properties 并通过使用 RestartEndpoint 我将重新启动应用程序上下文并注入来自 application-prod.properties 的所需 bean。但我需要在没有application-prod.properties 的情况下启动,但如果此文件存在,我将在 prod 配置文件中启动。

【问题讨论】:

  • “如果产品配置文件不存在”?? spring 配置文件的要点是您可以将一个工件从一个环境提升到下一个环境,其中存在所有配置文件配置,使用系统属性或其他任何方式来决定每个环境中哪个配置文件处于活动状态。不应出现 prod 配置文件属性文件不存在的情况。

标签: java spring spring-boot spring-cloud-config spring-config


【解决方案1】:

您将个人资料信息设置在错误的位置。文件application.properties 包含所有配置文件(dev、stage、prod 等)共有的属性。对于配置文件,您应该按照您的建议创建一个名称为 application-{profile}.properties 的文件,该文件将根据变量 profile 定义的环境覆盖某些属性。

通常的方法是将此变量作为参数传递给 JVM(例如:-Dprofile=dev),如果您从 IDE 启动,您可以通过修改 servlet 容器的运行配置来设置。如果是独立的 tomcat,您可以通过文件setenv.sh 中的JAVA_OPTIONS 变量传递此信息。

【讨论】:

  • 我的意思是如果没有找到 application-prod.properties,我想在开发配置文件中启动我的应用程序(使用 application-dev.properties)。但默认情况下,我的个人资料是 prod(application-prod.properties)。如果我在 application.properties 中指定活动配置文件是 prod,并且如果在资源包中找不到 application-prod.properties,则我的应用程序无法启动。但是如果没有找到产品配置文件,我想自动切换到开发配置文件(application-dev.properties)。因为我想动态添加这个文件并在运行时重新启动所有应用程序。
【解决方案2】:

如果你想要这个,那你为什么需要application-dev.properties。将您的开发属性保存在 application.properties 中。如果配置文件设置,则applicatoin.properties 值将被覆盖。 Spring Boot 读取 application.properties && application.yml 并在配置文件处于活动状态时替换值

【讨论】:

    【解决方案3】:

    如果你需要手动实现某种业务逻辑与profiles,例如指定活动profile默认prod

    1. application.properties 中定义spring.profiles.active=prod

    例如,如果缺少application-prod.properties,那么活动配置文件应该是dev,您可以使用EnvironmentPostProcessor 来实现:

    允许在刷新应用程序上下文之前自定义应用程序的环境

    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注册你的EnvironmentPostProcessor实现类

    org.springframework.boot.env.EnvironmentPostProcessor=\ com.example.ProfileResolverEnvironmentPostProcessor

    另外,请查看 Spring Boot 文档Customize the Environment

    补充:

    当然,如果配置文件丢失,您可以指定将处于活动状态的 bean @Profile("!prod") 但是,如果您定义spring.profiles.active=prod,这在您的情况下不起作用,因为活动配置文件prod 将在Environment 中,但这与application-prod.properties 丢失的事实无关

    【讨论】:

      【解决方案4】:

      你可以这样做:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-21
        • 2020-05-07
        • 2011-11-03
        • 1970-01-01
        • 2017-12-21
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多