web-dev-qa-db-ja.com

システム変数からSpringプロファイルを設定するには?

別のプロジェクトを使用するSpringプロジェクトがあります。各プロジェクトには、各プロファイルにapplicationContext.xmlおよび*.propertiesを使用して、Javaコードから初期化する独自のスプリングプロファイルがあります。 args[]からプロファイルを挿入します。 問題は、2番目のプロジェクトがenvのデフォルト構成を使用することですapplicationContext.xmlargs[]から2番目のプロジェクトにenvを注入できず、記事を探してみたSpringプロファイルの仕組みを説明します。

  1. applicationContext.xmlでデフォルトが設定されていない場合にプロファイルを参照する階層はありますか?
  2. システム変数はapplicationContext.xml構成よりも強力ですか?
  3. 私の挑戦に対する最良の解決策は何だと思いますか?

その主題に関する記事や例さえも大歓迎です!!前もって感謝します。

42
user2656851

SPRING_PROFILES_ACTIVEは、Springプロファイルをオーバーライド/選択するための環境変数です

74
Lalit Jha

JVMにSpringプロファイルを提供する場合、問題はないはずです。

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

Spring-Documentationも参照してください。

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

69.5アクティブなSpringプロファイルの設定

Spring環境にはこのためのAPIがありますが、通常はシステムプロパティ(spring.profiles.active)またはOS環境変数(SPRING_PROFILES_ACTIVE)を設定します。例えば。 -D引数を使用してアプリケーションを起動します(メインクラスまたはjarアーカイブの前に配置することを忘れないでください)。

$ Java -jar -Dspring.profiles.active = production demo-0.0.1-SNAPSHOT.jar

Spring Bootでは、application.propertiesでアクティブなプロファイルを設定することもできます。

spring.profiles.active = production

この方法で設定された値は、SpringApplicationBuilder.profiles()メソッドではなく、Systemプロパティまたは環境変数設定に置き換えられます。したがって、後者のJava AP​​Iを使用して、デフォルトを変更せずにプロファイルを拡張できます。

詳細については、「スプリングブート機能」セクションの第25章「プロファイル」を参照してください。

42
JanTheGun

通常、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 Run Configuration - screenshot is unavailable

  • 環境変数

    コマンドラインで設定するには:export spring_profiles_active=dev

プロファイルを指定しないBeanは、「デフォルト」プロファイルに属します。


優先順位は次のとおりです。

  1. Web.xmlのコンテキストパラメータ
  2. WebApplicationInitializer
  3. JVMシステムパラメータ
  4. 環境変数
24
Ajmal V Aliyar

Dockerを使用してスプリングブートアプリを展開する場合、フラグeを使用してprofileを設定できます。

docker run -e "SPRING_PROFILES_ACTIVE = prod" -p 8080:8080 -t r.test.co/myapp:latest

2
db80

私の解決策は、環境変数をspring.profiles.active=developmentとして設定することです。そのため、そのマシンで実行されているすべてのアプリケーションが変数を参照し、アプリケーションを起動します。次のように、スプリングがプロパティをロードする順序

application.properties
system properties
environment variable
1
Achaius

コマンドラインを実行すると、WebアプリケーションディレクトリからJava -Dspring.profiles.active=development -jar yourApplication.jarが表示され、パスが正しくないことが示されます。そのため、次のようにapplication.propertiesファイルに手動でプロファイルを定義しました。

spring.profiles.active=mysql 

または

spring.profiles.active=postgres

または

spring.profiles.active=mongodb
1
georges van