[英]How to set Spring profile from system variable?
我有一個使用另一個項目的 Spring 項目。 每個項目都有自己的 spring 配置文件,使用每個配置文件的applicationContext.xml
和*.properties
從 java 代碼初始化。 我從args[]
注入配置文件。 問題是第二個項目使用applicationContext.xml
中 env 的默認配置 我無法將args[]
中的 env 注入第二個項目,我嘗試尋找一篇文章來解釋 Spring 配置文件的工作原理。
applicationContext.xml
中配置默認值時,是否有一個層次結構可以查看配置文件?applicationContext.xml
配置更強?關於該主題的文章甚至示例將不勝感激。
SPRING_PROFILES_ACTIVE 是覆蓋/選擇 Spring 配置文件的環境變量
如果您提供 JVM 的 Spring 配置文件,則應該沒有問題:
java -Dspring.profiles.active=development -jar yourApplication.jar
另請參閱 Spring 文檔:
69.5 設置激活的 Spring 配置文件
Spring Environment 有一個 API,但通常您會設置系統屬性 (spring.profiles.active) 或操作系統環境變量 (SPRING_PROFILES_ACTIVE)。 例如,使用 -D 參數啟動您的應用程序(記住將其放在主類或 jar 存檔之前):
$ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar
在 Spring Boot 中,您還可以在 application.properties 中設置活動配置文件,例如
spring.profiles.active=生產
以這種方式設置的值會被 System 屬性或環境變量設置替換,但不會被 SpringApplicationBuilder.profiles() 方法替換。 因此,后一種 Java API 可用於擴充配置文件而無需更改默認值。
有關更多信息,請參閱第 25 章“Spring Boot 功能”部分中的配置文件。
我通常使用基於注釋的配置而不是基於 XML 的配置來配置 applicationContext。 無論如何,我相信他們都有相同的優先級。
*回答你的問題,系統變量有更高的優先級*
@Component
@Profile("dev")
public class DatasourceConfigForDev
現在,配置文件是dev
注意:如果配置文件以@Profile("!dev")
則配置文件將排除 dev 並用於所有其他配置。
<beans profile="dev">
<bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("spring.profiles.active", "dev");
}
}
@Autowired
private ConfigurableEnvironment env;
// ...
env.setActiveProfiles("dev");
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-config.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
作為參數傳遞的配置文件名稱將在應用程序啟動期間激活:
-Dspring.profiles.active=dev
在 IDE 中,您可以設置應用程序運行時要使用的環境變量和值。 以下是Eclipse中的運行配置:
通過命令行設置: export spring_profiles_active=dev
任何未指定配置文件的 bean 都屬於“默認”配置文件。
如果您使用 docker 部署 spring boot 應用程序,則可以使用標志e設置配置文件:
docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t r.test.co/myapp:latest
您可以通過提供-Dspring.profiles.active=<env>
來設置彈簧配置文件
對於source(src) 目錄中的java 文件,可以通過System.getProperty("spring.profiles.active")
對於test 目錄中的java 文件,您可以提供
SPRING_PROFILES_ACTIVE
到<env>
或
因為“test”任務會忽略“environment”、“jvmArgs”和“systemProperties”。 在 root build.gradle
添加一個任務來設置 jvm 屬性和環境變量。
test {
def profile = System.properties["spring.profiles.active"]
systemProperty "spring.profiles.active",profile
environment "SPRING.PROFILES_ACTIVE", profile
println "Running ${project} tests with profile: ${profile}"
}
我的解決方案是將環境變量設置為spring.profiles.active=development
。 這樣在該機器上運行的所有應用程序都將引用該變量並啟動應用程序。 spring加載屬性的順序如下
application.properties
system properties
environment variable
如果我運行命令行: java -Dspring.profiles.active=development -jar yourApplication.jar
從我的 webapplication 目錄它指出路徑不正確。 所以我只是在 application.properties 文件中手動定義了配置文件,如下所示:
spring.profiles.active=mysql
或
spring.profiles.active=postgres
或
spring.profiles.active=mongodb
參加聚會為時已晚,但這里是該主題的新趨勢: https : //howtodoinjava.com/spring-boot2/logging/profile-specific-logging/
這是一個很好的例子:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="c:/temp/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d</fileNamePattern>
</rollingPolicy>
</appender>
<springProfile name="local | dev">
<logger name="org.springframework" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="!local & !dev & !prod">
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</springProfile>
</configuration>
!注意! 如果您在使用&
遇到問題&
請將其替換為&
以前的大多數答案要么已經過時,要么無緣無故地過於復雜。
此時,您可以在 application.properties 中輕松設置活動配置文件,如下所示:
YOUR_PROFILE<\/code>在哪里...您的個人資料
我多次使用它,其中大部分是我將數據源與其存儲庫、實體、控制器等隔離開來...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.