別のプロジェクトを使用するSpringプロジェクトがあります。各プロジェクトには、各プロファイルにapplicationContext.xml
および*.properties
を使用して、Javaコードから初期化する独自のスプリングプロファイルがあります。 args[]
からプロファイルを挿入します。 問題は、2番目のプロジェクトがenvのデフォルト構成を使用することですapplicationContext.xml
args[]
から2番目のプロジェクトにenvを注入できず、記事を探してみたSpringプロファイルの仕組みを説明します。
applicationContext.xml
でデフォルトが設定されていない場合にプロファイルを参照する階層はありますか?applicationContext.xml
構成よりも強力ですか?その主題に関する記事や例さえも大歓迎です!!前もって感謝します。
SPRING_PROFILES_ACTIVEは、Springプロファイルをオーバーライド/選択するための環境変数です
JVMにSpringプロファイルを提供する場合、問題はないはずです。
Java -Dspring.profiles.active=development -jar yourApplication.jar
Spring-Documentationも参照してください。
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 APIを使用して、デフォルトを変更せずにプロファイルを拡張できます。
詳細については、「スプリングブート機能」セクションの第25章「プロファイル」を参照してください。
通常、XMLベースの構成ではなく、注釈ベースの構成を使用してapplicationContextを構成します。とにかく、私はそれらの両方が同じ優先度を持っていると信じています。
*質問に答えると、システム変数の優先度が高くなります*
@Component
@Profile("dev")
public class DatasourceConfigForDev
現在、プロファイルはdev
です
注:プロファイルが@Profile("!dev")
として指定されている場合、プロファイルはdevを除外し、他のすべてのプロファイルになります。
<beans profile="dev">
<bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
</beans>
Webアプリケーションでは、WebApplicationInitializerを使用して、ServletContextをプログラムで構成できます。
@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");
プロファイルは、コンテキストパラメータを使用して、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>
パラメータとして渡されたプロファイル名は、アプリケーションの起動時にアクティブになります。
-Dspring.profiles.active=dev
IDEでは、アプリケーションの実行時に使用する環境変数と値を設定できます。以下は、Eclipseの実行構成です。
コマンドラインで設定するには:export spring_profiles_active=dev
プロファイルを指定しないBeanは、「デフォルト」プロファイルに属します。
Dockerを使用してスプリングブートアプリを展開する場合、フラグeを使用してprofileを設定できます。
docker run -e "SPRING_PROFILES_ACTIVE = prod" -p 8080:8080 -t r.test.co/myapp:latest
私の解決策は、環境変数をspring.profiles.active=development
として設定することです。そのため、そのマシンで実行されているすべてのアプリケーションが変数を参照し、アプリケーションを起動します。次のように、スプリングがプロパティをロードする順序
application.properties
system properties
environment variable
コマンドラインを実行すると、WebアプリケーションディレクトリからJava -Dspring.profiles.active=development -jar yourApplication.jar
が表示され、パスが正しくないことが示されます。そのため、次のようにapplication.propertiesファイルに手動でプロファイルを定義しました。
spring.profiles.active=mysql
または
spring.profiles.active=postgres
または
spring.profiles.active=mongodb