Spring 3.1のデフォルトプロファイル


100

私のアプリケーションでは、@Profile("prod")とで注釈が付けられたBeanがあり@Profile("demo")ます。最初の1つは、ご想像のとおり、本番DBに接続するBeanで使用され、2番目の1つは、偽のDB(HashMapまたはその他)を使用するBeanに注釈を付けて、開発を高速化します。

私が欲しいの"prod"は、「something-else」によってオーバーライドされない場合に常に使用されるデフォルトのプロファイル()です

私に持っているのが完璧web.xmlです:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

そしてこれをオーバーライドし-Dspring.profiles.active="demo"て、私ができるようにしました:

mvn jetty:run -Dspring.profiles.active="demo". 

しかし、残念ながらこれは機能していません。どうすればそれを達成できますか?-Dspring.profiles.active="prod"すべての私の環境での設定はオプションではありません。

回答:


67

私の経験は、

@Profile("default")

Beanは、他のプロファイルが識別されない場合にのみコンテキストに追加されます。たとえば-Dspring.profiles.active="demo"、別のプロファイルを渡した場合、このプロファイルは無視されます。


4
受け入れられる答えはweb.xmlに依存します(それは問題ありません)。この答えは、web.xmlの有無にかかわらず機能するため、誰にとってもより広く役立ちます。
ジェイ

1
このソリューションはよりクリーンです
cahen 2015

これは公式の機能ですか、それとも副作用ですか?この機能が説明されているSpringドキュメントにリンクしますか?
rustyx 2015

111

実稼働環境をweb.xmlのデフォルトプロファイルとして定義します

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

別のプロファイルを使用する場合は、システムプロパティとして渡します

mvn -Dspring.profiles.active="demo" jetty:run

3
彼は、web.xmlでシステムプロパティとしてアクティブプロファイルを定義しようとしませんでした。私のソリューションでは、web.xmlでデフォルトプロファイルを構成し、システムプロパティを介してアクティブプロファイルを上書き/定義します。明示的なアクティブプロファイルがない場合は、デフォルトが使用されます。
andih

1
ありがとう!これがまさに私が欲しかったものです!どこでもそれを見つけることができませんでした:/
のMichałMargiel

このアプローチの1つの問題:で設定spring.profiles.default=prodした 場合application.propertiesapplication-prod.propertiesロードされません。これは直観に反しています。
gamliela

@gamlielaこのアプローチでは、application.propertiesファイルにデフォルトのプロファイルを設定しません。それを知るためにapplication-prod.propertiesする必要があります使用しますが、プロファイルを知っている必要があります。それが、このアプローチが行うことです。web.xml(デフォルト)または環境変数を介して(デフォルトを上書き)、Springコンテキスト外のプロファイルを定義します。
andih

@andihはい、わかりますが、直感的ではないため問題があるとだけ言います。application-default.propertiesロードされるので、それもapplication-newdefault.propertiesロードされることを期待しています。それは...それは春との問題です、あなたの解決策の問題ではありません
gamliela

6

同じ問題がありますが、プログラムでServletContextを構成するためにWebApplicationInitializerを使用しています(Servlet 3.0以降)。だから私は次のことをします:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

5

PRODプロファイルを削除して、@ Profile( "!demo")を使用することもできます。


2
これは、プロファイルが3つ以上ある場合は機能しないと思いますよね?
2015

3

既に投稿されたデフォルトのプロダクションプロファイルの設定について@andih

Maven Jettyプラグインのデフォルトプロファイルを設定する最も簡単な方法は、プラグイン構成に以下の要素を含めることです。

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

3

Springは、どのプロファイルがアクティブであるかを判別するときに、2つの別個のプロパティーを提供します。

  • spring.profiles.active

そして

  • spring.profiles.default

場合はspring.profiles.active設定され、その値は、プロファイルがアクティブであるかを決定します。しかし、spring.profiles.active設定されていない場合、Springはspring.profiles.default.

spring.profiles.activespring.profiles.default設定もされていない場合は、アクティブなプロファイルはなく、プロファイル内にあると定義されていないBeanのみが作成されdefaultます。プロファイルを指定していないBeanはすべてプロファイルに属します。


-1

web.xmlをフィルター処理されたリソースとしてセットアップし、この値をMavenプロファイル設定からMavenに入力させることができます。

pomですべてのリソースをフィルタします(リソースに$ {}マークがない場合は追加できます)

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

web.xmlに

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

pomでmavenプロファイルを作成する

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

今、あなたは使うことができます

mvn jetty:run -P DEMO

または単に-P DEMOmavenコマンドで


1
よくわかりませんが、うまくいきません。IMHO jetty:runは、リソースがフィルタリングされるフェーズを実行しません。
のMichałMargiel

-P DEMOを実行しますが、コンパイルされていないコードで、それはautimaticlyそれを実行します:caurseのあなたは、MVNクリーンコンパイル桟橋実行する必要がある
Hurda

10
Spring 3.1プロファイルの主な目標の1つが、すべての環境にデプロイできる単一のWARファイルを生成することであることを理解しています。Mavenプロファイルを使用すると、以前の状態に戻ることができます。各環境でWARファイルのパッケージ化が必要でした...
edrabc

@edrabc彼はmvn jetty:runを求めていました-WARファイルがありません。
フルダ2013年

@Hurdaに同意します。しかし、彼は複数の環境でコマンドを実行することも求めていました
。Maven
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.