Develop with pleasure!

福岡でCloudとかBlockchainとか。

Mavenビルド時に開発用とリリース用でリソースを入れ替える。

アプリケーションの開発中、開発用のモジュールとリリース用のモジュールで、設定ファイル等を書き換えたいというケースは多いと思う。代表的な例だとDBへの接続。開発中はJDBCのDriverManagerで接続し、リリース時はJNDIからDataSourceを取得とか。

Maven2ではそういった環境に依存する設定をProfileという概念で環境毎に定義できる。pom.xml

<profiles>
    <profile>
        <id>release</id>
        <properties>
            <maven.test.skip>true</maven.test.skip>
        </properties>
    </profile>
</profiles>

と追加し、

mvn install -P release

とPオプションでプロファイルを選択して実行する。上の例では、単体テストがスキップされる。

で、やりたいのはリソースファイルの切り替えなので、releaseのプロファイルにタグを追加してrelease用のビルドルールを定義する。
今回、データベースの設定はapplicationContext.xmlに記載しており、開発時はorg.springframework.jdbc.datasource.DriverManagerDataSourceを使用し、リリース時は、org.springframework.jndi.JndiObjectFactoryBeanを使用する。開発用のapplicationContext.xmlはsrc/main/webapp/WEB-INF直下に配置し、リリース用のapplicationContext.xmlはsrc/release/webapp/WEB-INFというフォルダ構成で配置する。で、pom.xml

<profiles>
    <profile>
        <id>release</id>
        <properties>
            <maven.test.skip>true</maven.test.skip>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <webResources>
                            <resource>
                                <directory>src/release/webapp</directory>
                            </resource>
                            <resource>
                                <directory>src/main/webapp</directory>
                            </resource>
                         </webResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

maven-war-pluginでWebアプリケーションのリソースファイルの配置場所がとして定義できる。そのリソースのフォルダにリリース用のリソースファイルを先に記載することでWARファイルを生成する際にリリース用のリソースファイルが上書きされ、環境毎に設定ファイルが書き換わったモジュールができる。
最初は、mvnの実行前にantで書き換えるしかないのか?とか思ったが、Maven単体でクローズできるのが良い。