ビルドツールとして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
をアクティブなプロファイルとして持たせたいと思います。
春にアクティブにするプロファイルの情報を保持するプロパティファイルなど、アプリケーションのリソースをフィルターする必要があります。
例えば
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>
注:これは実際には悪い習慣であり、実行時にシステムプロパティでプロファイルを設定する必要があります
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アプリを実行します最初に必要なのは、構成を保持するための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 {
// ...
}
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>
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プロファイルが追加されます。