66

I have an application with maven as a build tool.

I am using maven profiles to set up different properties from different profiles.

What i would like to do is that all active profiles in maven will be ported to spring active profiles as well so i can reference them in bean signature (@profile). but i am not sure how to do it.

for example: consider the following maven setup

<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>

assuming i run maven with out specifying any other profiles i would like for spring to have profile1 and development as active profiles.

4

8 に答える 8

41

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>

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

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

3 番目に、プロファイル依存の 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 アプリを実行します。
  • H2 DB で Web アプリを実行するmvn clean jetty:run -Dspring.profiles.active=h2
于 2016-03-24T12:20:03.453 に答える
23

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

例えば

spring.profile = ${mySpringProfile}

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

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

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

: 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>

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

于 2014-08-21T09:41:41.017 に答える
1

スプリング ブート プラグイン自体が役立ちます。

  <profiles>
    <profile>
      <id>postgres</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <jmxPort>9001</jmxPort>
              <environmentVariables>
                <SPRING_PROFILES_ACTIVE>postgres</SPRING_PROFILES_ACTIVE>
              </environmentVariables>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>h2</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <jmxPort>9002</jmxPort>
              <environmentVariables>
                <SPRING_PROFILES_ACTIVE>h2</SPRING_PROFILES_ACTIVE>
              </environmentVariables>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
于 2021-10-12T19:51:49.057 に答える