こんにちは。ニフティ株式会社、新卒2年目の小林です。
近日、Javaプロジェクトをインフラから作ることに着手しており、Mavenを使用したパッケージのビルドを行うことになりました。その際に得た便利なPオプションについて共有します。
変更内容
結論から述べますと、以下の2項目により実現可能です。maven 3.5.2 を使用しています。
ビルド時コマンドの追加
&env はpom.xmlで設定したidを入力します。(例:hoge1, local, develop, production)
1 |
maven clean package -P &env |
pom.xmlの変更
<profiles><profile>タグにより、各環境(id)ごとに変化する定数について設定することが出来ます(<properties>)。また、<activation>, <activeByDefault>で指定されたprofileを、Pオプションが設定されていなかった場合の初期値に設定することが出来ます。(公式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<profiles> <profile> <id>hoge1</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <fuga1>/webappファイルが存在する相対パス/</fuga1> <fuga2>/あるファイルが存在する相対パス/</fuga2> ... </properties> </profile> <profile> <id>hoge2</id> ... <profiles> |
そののち、<properties>で設定したタグ名を共通した箇所で使用することで、環境ごとの設定を反映させることが出来ます。
例えば、warとしてパッケージ化する際のwebappDirectoryのパス指定(参考)を以下のように変数化することが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 |
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>~~~</version> <configuration> <webappDirectory>${fuga1}/directory</webappDirectory> </configuration> </plugin> </plugins> </build> |
例えば、 -P hoge1
と指定されていれば、 ${fuga1}には hoge1のprofileで設定されたfuga1が指定されます。
ユースケース
様々な環境における構成図とprofileの例を紹介します。含まれているファイルの拡張子は、読み込む形式に従って適切に変更してください。
ただ、<id>タグと、<properties>タグの中身を変更するのみです。
ローカル環境
設定ファイルの中に、Dockerで作成されたネットワーク内のWiremockを使用するコードがあった場合です。
1 2 3 4 5 6 7 8 9 |
<profile> <id>local</id> <properties> <fuga1>/ローカル環境用の設定ファイルが存在する相対パス/</fuga1> <fuga2>/ローカル環境用のあるファイルが存在する相対パス/</fuga2> ... </properties> </profile> |
開発環境
設定ファイルの中に、開発用の外部APIを使用するコードがあった場合です。
本番環境も構成は同じになります。
1 2 3 4 5 6 7 8 |
<profile> <id>develop</id> <properties> <fuga1>/開発環境用の設定ファイルが存在する相対パス/</fuga1> <fuga2>/開発環境用のあるファイルが存在する相対パス/</fuga2> ... </properties> </profile> |
本番環境(商用)
1 2 3 4 5 6 7 8 |
<profile> <id>production</id> <properties> <fuga1>/本番環境用の設定ファイルが存在する相対パス/</fuga1> <fuga2>/本番環境用のあるファイルが存在する相対パス/</fuga2> ... </properties> </profile> |
<profiles>まとめ
以上3環境の設定をpom.xmlに記載した際の<profiles>を以下に記述します。
<activeByDefault>が指定されているため、Pオプションを設定しない場合はlocalのprofileが呼び出されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<profiles> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <fuga1>/ローカル環境用の設定ファイルが存在する相対パス/</fuga1> <fuga2>/ローカル環境用のあるファイルが存在する相対パス/</fuga2> </properties> </profile> <profile> <id>develop</id> <properties> <fuga1>/開発環境用の設定ファイルが存在する相対パス/</fuga1> <fuga2>/開発環境用のあるファイルが存在する相対パス/</fuga2> </properties> </profile> <profile> <id>production</id> <properties> <fuga1>/本番環境用の設定ファイルが存在する相対パス/</fuga1> <fuga2>/本番環境用のあるファイルが存在する相対パス/</fuga2> </properties> </profile> </profiles> |
終わりに
今回はMavenのビルド時における、便利なPオプションについてまとめました。コマンドの追加とpom.xmlの変更のみで、環境ごとに読み込むファイルを変更することが出来ました。Javaの勉強をしていくにつれて、他にも便利な機能が存在すると思うので、環境に合わせた最適なオプションを設定出来るように日々研鑽していきます。