3

我有 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

4 回答 4

1

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

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

于 2018-07-30T11:07:24.257 回答
1

你可以这样做:

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);
于 2018-08-17T04:04:37.133 回答
1

如果您需要手动实现某种业务逻辑,例如,默认情况下指定活动配置文件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. 在中注册您的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

于 2018-08-01T01:47:07.767 回答
0

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

于 2018-07-30T11:10:07.753 回答