我有Spring Boot应用程序,我有3个属性文件:applications.properties, applications-dev.properties, applicaton-prod.properties
。在CCD_ 2中,我指定CCD_。但我想允许在没有产品配置文件(applicaton-prod.properties
(的情况下启动应用程序。这意味着spring必须自动启动dev概要文件(applications-dev.properties
(中的应用程序。我该如何实现?可能存在某些MissingOnProfile
注释?(我的任务是基于application.properties文件创建不同的应用程序行为。此外,我在每个依赖于特定概要文件的bean中使用@Profile
注释。所有任务都是创建WebInstaller,在完成步骤中,我将创建application-prod.properties,通过使用RestartEndpoint
,我将重新启动应用程序上下文,并从application-prod.properties
注入所需的bean。但我需要用oudapplication-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);
您将配置文件信息设置在错误的位置。文件application.properties
包含所有配置文件(dev、stage、prod等(共有的属性。对于配置文件,您应该按照建议创建一个名为application-{profile}.properties
的文件,该文件将根据变量profile
定义的环境覆盖某些属性。
通常的方法是将这些变量作为参数传递给JVM(例如:-Dprofile=dev
(,如果从IDE启动,则可以通过修改servlet容器的运行配置来设置JVM。如果是独立的tomcat,您可以通过文件setenv.sh
中的JAVA_OPTIONS
变量传递此信息。
如果您需要手动用概要文件实现某种业务逻辑,例如,指定活动概要文件默认为prod
- 在
application.properties
中定义spring.profiles.active=prod
例如,如果缺少applications.properties
0,则活动配置文件应为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"); } } }
-
在
META-INF/spring.factories
中注册您的EnvironmentPostProcessor
实现类
org.springframework.boot.env.EnvironmentPostProcessor=
com.example.ProfileResolverEnvironmentPostProcessor
此外,请参阅Spring Boot文档自定义环境
附加:
当然,如果概要文件缺少@Profile("!prod")
,您可以指定将处于活动状态的bean但是,如果您定义了spring.profiles.active=prod
,这在您的情况下是不起作用的,因为活动配置文件prod
将在spring.profiles.active=prod
0中,但它与application-prod.properties
缺少这一事实无关
如果您想要,那么为什么需要application-dev.properties
。将您的dev属性保留在application.properties
中。如果设置了配置文件,则applicatoin.properties
值将被覆盖。弹簧引导读取CCD_ 35&;application.yml
,如果配置文件激活则替换值