web-dev-qa-db-ja.com

Mavenプロファイルでスプリングアクティブプロファイルを設定する方法

ビルドツールとしてmavenを使用するアプリケーションがあります。

Mavenプロファイルを使用して、異なるプロファイルから異なるプロパティを設定しています。

私がやりたいのは、MavenのすべてのアクティブなプロファイルがSpring Active Profileにも移植されるため、Bean署名(@profile)でそれらを参照できることです。しかし、私はそれを行う方法がわかりません。

たとえば、次のMavenセットアップを検討してください。

<profiles>
    <profile>
        <id>profile1</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>profile2</id>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>    
        </properties>
    </profile>
</profiles>

他のプロファイルを指定せずにmavenを実行すると仮定すると、スプリングにprofile1およびdevelopmentをアクティブなプロファイルとして持たせたいと思います。

52
Gleeb

春にアクティブにするプロファイルの情報を保持するプロパティファイルなど、アプリケーションのリソースをフィルターする必要があります。

例えば

spring.profile = ${mySpringProfile}

そして、プロファイルごとに、この変数の値を定義します(mySpringProfile)。

ビルド中に、これは現在アクティブなプロファイルで定義された値に応じてフィルタリングされます。

次に、アプリケーションのbootstrapの実行中に、このファイルに従って適切なプロファイルを選択します(詳細情報を提供しなかったため、これ以上は役に立ちませんが、これは非常に簡単です)。

:Mavenで現在アクティブなプロファイル(-P値を保持するproject.profiles.activeなど)を取得する方法が見つからないため、新しいプロファイルを設定する必要があります。各プロファイルの変数。

注2:Webアプリケーションを実行している場合、この中間ファイルを使用する代わりに、web.xmlでこの値をフィルターします

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

:これは実際には悪い習慣であり、実行時にシステムプロパティでプロファイルを設定する必要があります

21
poussma

2つのmaven + springプロファイルを同時に切り替えるよりエレガントな方法があります。

最初、POMにプロファイルを追加(注意を払う-maven + springプロファイルは単一のシステム変数によってアクティブ化されます):

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <property>
                <name>spring.profiles.active</name>
                <value>postgres</value>
            </property>
        </activation>
        <dependencies>
            <dependency>
                <groupId>postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>9.1-901.jdbc4</version>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>h2</id>
        <activation>
            <property>
                <name>spring.profiles.active</name>
                <value>h2</value>
            </property>
        </activation>           
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.191</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>

Second、スプリングのデフォルトプロファイルを設定します(Mavenの場合、POMで既に設定されています)。 Webアプリケーションの場合、web.xmlに次の行を挿入しました。

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

Third、プロファイルに依存するBeanを設定に追加します。私の場合(XML構成)、それは次のとおりです。

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mainDataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties" ref="hibProps"/>
    <property name="packagesToScan">
        <list>
            <value>my.test.model</value>
        </list>
    </property>
</bean>
...
<beans profile="postgres">
    <bean name="mainDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://127.0.0.1:5432/webchat" />
        <property name="username" value="postgres" />
        <property name="password" value="postgres" />
    </bean>
</beans>

<beans profile="h2">
    <bean name="mainDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:file:./newsdb;INIT=RUNSCRIPT FROM 'classpath:init.sql';TRACE_LEVEL_FILE=0" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>
</beans>

次のことが可能になりました。

  • mvn jetty:runまたはmvn jetty:run -Dspring.profiles.active=postgresコマンドを使用してPostgres DBでWebアプリを実行します
  • mvn clean jetty:run -Dspring.profiles.active=h2を使用してH2 DBでWebアプリを実行します
34
Eugene

最初に必要なのは、構成を保持するための2つのプロパティファイルです。ファイルの名前は、パターンapplication- {custom_suffix} .propertiesと一致する必要があります。 Mavenプロジェクトのsrc/main/resourcesディレクトリで、メインapplication.propertiesファイルの隣に作成します。このファイルは、後で使用して、他の1つをアクティブにし、両方のプロファイルで共有される値を保持します。

次に、pom.xmlを変更します。各Mavenプロファイルでカスタムプロパティを定義し、特定のプロファイルでロードする対応するプロパティファイルのサフィックスと一致するように値を設定する必要があります。次のサンプルでは、​​デフォルトで実行する最初のプロファイルもマークしていますが、必須ではありません。

<profile>
    <id>dev</id>
    <properties>
        <activatedProperties>dev</activatedProperties>
    </properties>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>
<profile>
    <id>release</id>
    <properties>
        <activatedProperties>release</activatedProperties>
    </properties>
</profile>

次に、同じファイルのビルドセクションで、リソースプラグインのフィルタリングを構成します。これにより、前の手順で定義されたプロパティを次の手順であるリソースディレクトリ内の任意のファイルに挿入できます。

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    …
</build>

最後に、application.propertiesに次の行を追加します。

spring.profiles.active=@activatedProperties@

ビルドが実行されると、リソースプラグインはプレースホルダーをアクティブなMavenプロファイルで定義されたプロパティの値に置き換えます。アプリケーションの起動後、Springフレームワークは、アクティブなSpringプロファイルの名前に基づいて適切な構成ファイルをロードします。これは、spring.profiles.activeプロパティの値によって記述されます。 Spring Boot 1.3は、フィルタリングされた値のデフォルトのリソースプラグイン構文を置き換え、@activatedProperties@表記の代わりに${activatedProperties}を使用することに注意してください。

完璧に機能しました。これがあなたのお役に立てば幸いです。

現在、サーブレット2.5およびJava 6のみをサポートする古いサーバー/コンテナで実行できる必要がある(私の制御を超えた理由により)小さなwebappを構築しています。 webapp構成は完全に自己完結型であるため、システム変数やJVMパラメーターも使用できません。管理者は、デプロイメント用のコンテナーにドロップできる各環境の.warファイルのみが必要です。

WebアプリでSpring 4.xを使用しています。これは、アクティブなMavenプロファイルを使用してアクティブなSpring 4.xプロファイルを設定するようにアプリケーションを構成する方法です。


pom.xmlファイルの変更

POMファイルに次のビットを追加しました。 POMはモデルバージョン4.0.0を使用しており、ビルド時にMaven 3.1.xを実行しています。

<modelVersion>4.0.0</modelVersion>

...

<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <!-- Default to dev so we avoid any accidents with prod! :) -->
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>dev</spring.profiles.to.activate>
        </properties>
    </profile>
    <profile>
        <id>uat</id>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>uat</spring.profiles.to.activate>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <!-- This can be a single value, or a comma-separated list -->
            <spring.profiles.to.activate>prod</spring.profiles.to.activate>
        </properties>
    </profile>
</profiles>

...

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <webResources>
                    <webResource>
                        <filtering>true</filtering>
                        <directory>src/main/webapp</directory>
                        <includes>
                            <include>**/web.xml</include>
                        </includes>
                    </webResource>
                </webResources>
                <failOnMissingWebXml>true</failOnMissingWebXml>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

web.xmlファイルの変更

<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Setup for root Spring context
-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-core-config.xml</param-value>
</context-param>
<!--
Jim Tough - 2016-11-30
Per Spring Framework guide: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-environment

...profiles may also be activated declaratively through the spring.profiles.active 
property which may be specified through system environment variables, JVM system 
properties, servlet context parameters in web.xml, or even as an entry in JNDI.
-->
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>${spring.profiles.to.activate}</param-value>
</context-param>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->

これで、特定のSpringプロファイルがアクティブな場合にのみ使用される以下のようなJavaベースの構成クラスを作成できます。

@Configuration
@Profile({"dev","default"})
@ComponentScan
@EnableTransactionManagement
@EnableSpringDataWebSupport
public class PersistenceContext {
    // ...
}
1
Jim Tough

Web.xmlにプレースホルダー${activeProfile}を追加します。

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

各プロファイルのpom.xmlでプロパティを設定します。

<profiles>
  <profile>
    <id>profile1</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <activeProfile>profile1</activeProfile>
    </properties>
  </profile>
  <profile>
    <id>profile2</id>
    <properties>
      <activeProfile>profile2</activeProfile>
    </properties>
  </profile>
</profiles>

maven-war-pluginを追加し、<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>またはmvn package -Pprofile1を実行するときにプレースホルダーを置き換えるようにmvn package -Pprofile2を設定します。

<build>
  <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
      <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
  </plugin>
</build>
0
xxg

Spring Bootアプリケーションの場合、pom.xmlのMavenプロファイルにプロパティを追加し、application.propertiesでそのプロパティを参照できます。

たとえば、pom.xmlというプロパティを使用して、Mavenプロファイルをspring.profile.from.mavenに追加します。

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile.from.maven>postgres</spring.profile.from.maven>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>noDb</id>
        <properties>
            <spring.profile.from.maven>noDb</spring.profile.from.maven>
        </properties>
    </profile>
</profiles>

application.propertiesのMavenプロパティを参照します。

[email protected]@

この設定では、postgres Mavenプロファイルを使用して、またはプロファイルなしでmavenを実行すると、Springのアクティブプロファイルのリストにpostgres Springプロファイルが追加され、noDb MavenプロファイルでMavenを実行すると、SpringのアクティブプロファイルのリストにnoDb Springプロファイルが追加されます。

0
Sayadi