11

特定の Maven プロファイルがアクティブかどうかに基づいて、データベース情報を使用して Spring 構成ファイルを構成しようとしています。これに対する回答を見てきましたが、すべてをまとめるのに苦労しています。

次のような Maven プロファイルがあります。

<profiles>
    <profile>
        <id>production</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>prod</value>
            </property>
        </activation>
    </profile>

    <profile>
        <id>development</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>dev</value>
            </property>
        </activation>

        <!-- Database properties for Spring -->
        <properties>
            <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>
            <db.type>oracle</db.type>
            <db.host>192.168.0.0</db.host>
            <db.port>1521</db.port>
            <db.name>myDb</db.name>
            <db.url>jdbc:${db.type}:thin:@${db.host}:${db.port}:${db.name}</db.url>
        </properties>

そして、次のような settings.xml ファイル:

<servers>
  <server>
    <id>development</id>
    <username>jsmith</username>
    <password>secret</password>
  </server>
</servers>

....

<profiles>
  <profile>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>

    <properties>
      <environment.type>dev</environment.type>
    </properties>
  </profile>
</profiles>

および servlet-context.xml では:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
    <property name="driverClassName">
        <value>${db.driver}</value>
    </property>

    <property name="url">
        <value>${db.url}</value>
    </property>

    <property name="username">
        <value>${db.username}</value>
    </property>

    <property name="password">
        <value>${db.password}</value>
    </property>

    <property name="maxActive">
        <value>10</value>
    </property>

    <property name="maxIdle">
        <value>1</value>
    </property>
</bean>

私の質問は基本的に、Maven プロパティを servlet-context.xml ファイルに取得するにはどうすればよいですか? .properties ファイルは必要ですか? Spring の Maven と PropertyPlaceholderConfigurer でのフィルタリングについては少し知っていますが、それらを組み合わせる方法がわかりません。それとももっと簡単な方法がありますか?

4

3 に答える 3

10

.properties ファイルは必要ですか?

一般的に言えば、はい、.properties ファイルを使用する必要があります。これは、特に Spring コンテキスト ファイルでデータベース接続構成を処理するために通常行っていることです。

.properties ファイルの目的は、アプリケーションの実行時にデータベース接続を構成する機能を提供することです (Web アプリケーションの場合、通常、.properties ファイルの変更後にアプリケーション コンテナー/サーバーを再起動する必要があります)。これは通常、異なる環境 (DEV/TEST/UAT/PROD) でのアプリケーションの展開/インストールの段階で行われます。

これらのデータベース接続設定を pom.xml に保存することはお勧めできません。pom.xml の目的はプロジェクトの説明であり、アプリケーションのビルド時に一度だけ使用されるためです (例: mvn deploy)。そして、ほとんどの場合、最終的な jar/war ファイルにパックされていても、アプリケーションのビルド後にあまり気にせず、触ることはありません。

Spring コンテキストで .properties ファイルを使用するには、applicationContext で propertyConfigurer Bean を定義します。次に例を示します。

<bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <!-- Default location inside war file -->
      <value>classpath:db.properties</value>
      <!-- Environment specific location, a fixed path on server -->
      <value>file:///opt/my-web-app/conf/db.properties</value>
    </list>
  </property>
  <property name="ignoreResourceNotFound" value="true"/>
</bean>

これが理にかなっていることを願っています。

于 2012-08-08T23:43:26.653 に答える
5

2 つの回答と私の研究から学んだことを使用して、pom によって制御され、正しいデータベース値を設定する開発/運用システムを取得することができました。

まず、pom で 2 つのプロファイルを作成しました。

<!-- Production and Development Profiles -->

<profiles>
    <!-- Nike profile needs go here -->
    <profile>
        <id>production</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>prod</value>
            </property>
        </activation>
    </profile>

    <!-- Catalyst profile needs go here -->
    <profile>
        <id>development</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>dev</value>
            </property>
        </activation>

        <build>

            <!-- This holds the properties for the Spring context file.
                 Database values will be changes to development. -->
            <filters>
                <filter>src/main/resources/dev.database.properties</filter>
            </filters>

            <resources>

                <!-- This is the directory that holds the Spring context
                     file.  The entire folder is searched, so either no
                     other file should have place holders or you should
                     exclude other files from being filtered. -->
                <resource>
                    <directory>src/main/webapp/WEBINF/</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
    </profile>
</profiles>

servlet-context.xml の WEBINF ディレクトリに、プレースホルダーを配置しました。

<!-- For database, uses maven filtering to fill in placeholders -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url"             value="${db.url}" />
    <property name="username"        value="${db.username}" />
    <property name="password"        value="${db.password}" />
    <property name="maxActive">
        <value>10</value>
    </property>
    <property name="maxIdle">
        <value>1</value>
    </property>
</bean>

次に、src/main/resources に配置するプロパティ ファイルを作成しました。

#
# Development database properties file
#
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID
db.username=jsmith
db.password=s3cr3t

その後、Maven を起動できます

mvn -P developement clean install

または、正しいプロファイルを設定する settings.xml があります。

<settings>
  <profiles>
    <profile>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>

      <properties>
        <environment.type>dev</environment.type>
      </properties>
    </profile>
  </profiles>   
</settings>
于 2012-08-09T23:13:54.880 に答える
2

主な質問は次のとおりです: WAR ファイルをさまざまな環境にどのように展開しますか?、RPM を介して、ジェンキンス ビルドを手動で実行しますか? また、同じ WAR ファイルをすべての環境に展開しますか?

a) WAR を JENKINS ジョブを介して (または Maven を介して手動で) デプロイしたい場合は、リソースを処理し、jar のビルド プロセスでプロファイルを使用するだけです (mvn -P production clean deploy)。maven pom にはコードが含まれている必要があります。このような:

    <filters>
        <filter>${config.maven.plattform.resources}/environment/${config.environment.dir}/your_proyect.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>resources/servlet-context.xml</directory>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>target/generated-resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

ファイル your_proyect.properties (環境ごとに 1 つ) でプロパティを定義し、すべての異なるプロファイルに対して config.environment.dir も定義する必要があります。

b) すべてのプロジェクトで同じ WAR/RPM などが必要です。次に、アプリケーション サーバーの Java スタートアップで環境をプロパティとして定義する必要があります。

<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
        <value>classpath:environment/${ENVIRONMENT}/your_project.properties</value>
        </list>
    </property>
</bean>

また、すべてのプロパティを WAR に入れることを忘れないでください。WAR ビルドの pom には、次のようなコードを含める必要があります。

                <execution>
                    <id>copy-env-resources</id>
                    <!-- here the phase you need -->
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes/environment/</outputDirectory>
                        <overwrite>true</overwrite>
                        <resources>
                            <resource>
                                <directory>${basedir}/${build_to_all_your_environments}</directory>
                                <includes>
                                    <include>**/*.properties</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>

c) 混合型: サーバー (-D) でプロパティとして定義されている環境よりも手動で環境を選択できます。デフォルトのプロパティを使用してこれを取得できます。見つからない場合は、その環境の環境に頼ります。このステップ別のプロパティのセットが必要なため、非常に複雑です。興味がある場合は、私の投稿を確認してください: maven と spring を使用したさまざまな環境への展開、 c) のより良いソリューションにも興味があります。

于 2012-08-09T12:50:11.830 に答える