簡體   English   中英

如何從系統變量設置 Spring 配置文件?

[英]How to set Spring profile from system variable?

我有一個使用另一個項目的 Spring 項目。 每個項目都有自己的 spring 配置文件,使用每個配置文件的applicationContext.xml*.properties從 java 代碼初始化。 我從args[]注入配置文件。 問題是第二個項目使用applicationContext.xml中 env 的默認配置 我無法將args[]中的 env 注入第二個項目,我嘗試尋找一篇文章來解釋 Spring 配置文件的工作原理。

  1. 當沒有在applicationContext.xml中配置默認值時,是否有一個層次結構可以查看配置文件?
  2. System var 是否比applicationContext.xml配置更強?
  3. 您認為應對我的挑戰的最佳解決方案是什么?

關於該主題的文章甚至示例將不勝感激。

SPRING_PROFILES_ACTIVE 是覆蓋/選擇 Spring 配置文件的環境變量

如果您提供 JVM 的 Spring 配置文件,則應該沒有問題:

java -Dspring.profiles.active=development -jar yourApplication.jar 

另請參閱 Spring 文檔:

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

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。 無論如何,我相信他們都有相同的優先級

*回答你的問題,系統變量有更高的優先級*


從 applicationContext 獲取基於配置文件的 bean

  • 在 Bean 上使用 @Profile

@Component
@Profile("dev")
public class DatasourceConfigForDev

現在,配置文件是dev

注意:如果配置文件以@Profile("!dev")則配置文件將排除 dev 並用於所有其他配置。

  • 在 XML 中使用配置文件屬性

<beans profile="dev">
    <bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>

設置配置文件的值:

  • 通過 WebApplicationInitializer 接口以編程方式

    在 Web 應用程序中,可以使用 WebApplicationInitializer 以編程方式配置 ServletContext
@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.setInitParameter("spring.profiles.active", "dev");
    }
}
  • 通過 ConfigurableEnvironment 以編程方式

    您還可以直接在環境上設置配置文件:
    @Autowired
    private ConfigurableEnvironment env;

    // ...

    env.setActiveProfiles("dev");
  • web.xml 中的上下文參數

    配置文件也可以在 web 應用程序的 web.xml 中激活,使用上下文參數:
    <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>
  • JVM系統參數

    作為參數傳遞的配置文件名稱將在應用程序啟動期間激活:

     -Dspring.profiles.active=dev

    在 IDE 中,您可以設置應用程序運行時要使用的環境變量和值。 以下是Eclipse中的運行配置:

Eclipse 運行配置 - 屏幕截圖不可用

  • 環境變量

    通過命令行設置: export spring_profiles_active=dev

任何未指定配置文件的 bean 都屬於“默認”配置文件。


優先順序是:

  1. web.xml 中的上下文參數
  2. 網絡應用初始化器
  3. JVM 系統參數
  4. 環境變量

如果您使用 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>

!注意! 如果您在使用&遇到問題&請將其替換為&amp;

以前的大多數答案要么已經過時,要么無緣無故地過於復雜。

此時,您可以在 application.properties 中輕松設置活動配置文件,如下所示:

YOUR_PROFILE<\/code>在哪里...您的個人資料

我多次使用它,其中大部分是我將數據源與其存儲庫、實體、控制器等隔離開來...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM