2014年4月11日金曜日

mavenで環境ごとに異なる設定ファイルをコピーする方法

例えば開発環境(dev)ステージング環境(stg)サービス環境(service)といった感じでそれぞれに設定ファイルが存在している場合に
いちいち設定ファイルを環境用に書きなおしてビルドするのは大変です。
今回はmavenの「プロファイル」という機能を使って環境ごとのプロパティファイルを用意しmavenコマンドでデプロイするファイルを操作したいと思います

■環境
CentOS release 6.3 (Final)
Apache Maven 3.1.1
java version "1.6.0_24"

■プロジェクト作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.kakakikikeke.test -DartifactId=sampleProject
    ※バージョン情報やスナップショットファイル名は適当に設定します
    ※groupIdやartifactIdは適宜変更して問題ございません

■pom.xml編集
1. 環境ごとの設定を追加
dependenciesタグの直後に以下を記載します
dev, stg, serviceごとにプロファイルを作成します
プロファイルごとに「configFileDirectory」という名前のプロパティ名が異なる点がポイントです
properties機能は変数のような機能で「${configFileDirectory}」とすることで値を参照することができます
今回は「configFileDirectory」としていますが好きな変数名を設定することが可能です
<profiles>
   <profile>
      <id>dev</id>
      <properties>
         <configFileDirectory>dev</configFileDirectory>
      </properties>
   </profile>
   <profile>
      <id>stg</id>
      <properties>
         <configFileDirectory>stg</configFileDirectory>
      </properties>
   </profile>
   <profile>
   <id>service</id>
      <properties>
         <configFileDirectory>service</configFileDirectory>
      </properties>
   </profile>
</profiles>

2. 環境ごとのディレクトリと設定ファイルを作成
mkdir -p conf/dev
mkdir -p conf/stg
mkdir -p conf/service

echo "dev" > conf/dev/config.properties
echo "stg" > conf/stg/config.properties
echo "service" > conf/service/config.properties

    ※今回はテストなので適当な設定ファイルを用意します

3. コピーするルールを記載する
先ほど記載したprofilesタグの直後に記載します
「maven-resources-plugin」を利用してファイルをコピーします
ポイントは
  • phaseタグで「compile」を指定している点
  • directoryタグで「conf/${configFileDirectory}」を指定している点
pharseタグで「compile」を指定することでmavenコマンド実行時のgoalsに「compile」が指定されている場合にだけこのコピーの動作は実行されるようになります
またdirectoryタグに「conf/${configFileDirectory}」と記載することで、プロファイルで設定された「${configFileDirectory}」を元に適切なディレクトリ配下からプロパティファイルをコピーし、outputDirectory配下にファイルを配置することができます
<build>
  <plugins>
    <!-- for resources copy -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.6</version>
      <executions>
        <execution>
          <id>copy-resources</id>
          <phase>compile</phase>
          <goals>
            <goal>copy-resources</goal>
          </goals>
          <configuration>
            <resources>
              <resource>
                <directory>conf/${configFileDirectory}</directory>
                <filtering>true</filtering>
              </resource>
            </resources>
            <outputDirectory>conf</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

4. テストしてみる
mvn clean compile -P service

として実行すると
conf/client.propertiesにはserviceと記載されたプロパティファイルが配置されていることがわかります
「-P profile_name」
とすることでプロファイルを変更することができますので「dev」や「stg」と変更して実行することでconf/client.properties配下の内容が変わっていることがわかると思います

■Tips
複数のディレクトリ配下のファイルをコピーしたい場合は</execution>タグを複数記載すればOKです
その場合「id」タグの情報が重複すると怒られるので「copy-resources-2」などとすれば大丈夫です

0 件のコメント:

コメントを投稿