[英]Spring Boot 2 use dev profile if prod profile is not exist
我有Spring Boot Application,我有3個屬性文件: applications.properties, applications-dev.properties, applicaton-prod.properties
。 在applications.properties
我指定spring.profiles.active=prod
。 但是我想允許沒有產品概要文件( applicaton-prod.properties
)的應用程序啟動。 這意味着spring必須自動在dev profile( applications-dev.properties
)中啟動應用applications-dev.properties
。 我該如何實施? 可能存在某些MissingOnProfile
批注嗎?)我的任務是基於application.properties文件創建不同的應用程序行為。 我也在每個依賴於特定配置文件的bean中使用@Profile
批注。 所有的任務是創建WebInstaller,並在完成步驟中我將創建application-prod.properties並通過RestartEndpoint
我會重新從應用環境和要求的豆類application-prod.properties
將注入。 但是我需要使用application-prod.properties
進行啟動,但是如果該文件存在,我將在prod配置文件中啟動。
您將配置文件信息設置在錯誤的位置。 文件application.properties
包含所有概要文件(dev,stage,prod等)共有的屬性。 對於配置文件,應按照您的建議,創建一個名為application-{profile}.properties
的文件,該application-{profile}.properties
將根據變量profile
定義的環境覆蓋某些屬性。
通常的方法是將此變量作為參數傳遞給JVM(例如-Dprofile=dev
),如果從IDE啟動,則可以通過修改servlet容器的運行配置來進行設置。 在獨立的Tomcat的情況下,你可以通過這個信息JAVA_OPTIONS
變量在文件中找到setenv.sh
。
例如,如果您需要使用概要文件手動實現某種業務邏輯,請指定默認情況下,活動概要文件為prod
application.properties
定義spring.profiles.active=prod
例如,如果缺少application-prod.properties
,則活動配置文件應該是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
額外:
當然,您可以指定在缺少概要文件@Profile("!prod")
將處於活動狀態的bean,但是如果您定義spring.profiles.active=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);
如果要這樣做,那么為什么需要application-dev.properties
。 將您的開發屬性保留在application.properties
。 如果配置文件設置,則applicatoin.properties
值將被覆蓋。 春天開機同時讀取application.properties
&& application.yml
如果輪廓主動替換值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.