レッツトライ!しもしも

エンジニアときどきイラストレーターのしもしもがレッツトライ!したことを描くブログ

「Apache Maven WAR Plugin」で環境ごとの設定ファイルを変更する方法とシクハクしたところまとめてみました[文字化け]

      2017/10/26

約1年ほどの新規開発がアプリケーションとして落ち着いてきた……。
保守開発やリリースがやりやすいようにするため、Mavenで環境ごとの設定ファイルを置換したりすることをやることになりました。
ちょっとシクハクしたことにも出くわした……ので、メモ。

War作成プラグイン「Apache Maven WAR Plugin」(maven-war-plugin)

warファイルが作成できるプラグインです。このプラグインに設定ファイルなどのファイルを置換や追加・除外することが可能です。

うまいこと設定できると、Mavenのプロファイルの切り替えだけでWarファイル作成時に、設定ファイルを入れ替えることが可能なんですね。

Apache Maven WAR Plugin – Introduction

If you feel like the plugin is missing a feature or has a defect, you can fill a feature request or bug report in our issue tracker. When creating a new issue, please provide a comprehensive description of your concern. Especially for fixing bugs it is crucial that the developers can reproduce your problem.

「Apache Maven WAR Plugin」とプロファイルの設定で環境ごとの設定ファイルを変更する

リリースする環境が増えてきて、手作業で切り替えがややこしくなってきたので、うまいことMavenの設定でできないかなぁ、と。
やりたいことが以下の3つ。

  • resourcesディレクトリーごとファイルを入れ替える
  • web.xmlを入れ替える
  • WEB-INFの一部のファイルだけを入れ替える

サンプルになるフォルダ構成をつくってみました。
フォルダが以下のようになっているとき、developmentプロファイルを設定し、Mavenプロジェクト更新すると、developmentのフォルダ内のファイルが置換されるようにしてみました。

resourcesディレクトリーごとファイルを入れ替える

こちらはプロファイルの設定のみで可能です。
pom.xmlの抜粋を。

web.xmlを入れ替える

「Apache Maven WAR Plugin」を使って、webXmlタグにパスを指定すると上書きされます。
通常ビルドとプロファイルのpropertiesタグにそれぞれweb.xmlのパスを記載することで動的に変更することができます。

WEB-INFの一部のファイルだけを入れ替える

targetPathタグでWEB-INFを指定し、springフォルダ内のxmlファイル(root-context.xml、servlet-context.xml)をフィルター機能で置換することにしました。

maven-war-pluginが正常稼働していたのに、パス指定したときに間違っているとき、以下のようなエラーが出ていました。
propertiesに書いたパスを疑ってみるといいかも。

Execution default-cli of goal org.apache.maven.plugins:maven-resources-plugin:2.6:copy-resources failed. (org.apache.maven.plugins:maven-war-plugin:3.0.0:war:default-war:package)

なぜか置換したファイルの一部の文字だけ文字化けする

んで、今回のでシクハクしたところ。
上の「WEB-INFの一部のファイルだけを入れ替える」を行ったとき、以下のようなエラーが発生しました。

Error occured processing XML ‘Invalid byte 3 of 3-byte UTF-8 sequence.’. 詳細についてはエラー・ログを参照してください servlet-context.xml /<プロジェクト名>/target/m2e-wtp/web-resources/WEB-INF/spring/appServlet

上のファイルのファイルを確認すると、コメントで書かれている日本語の「言」という文字だけ「�?」になって文字化けしてました。(ファイル内に3つあったから3-byteのエラーになってる。)

ファイルはUTF-8だし、コピーする前は正常に動いていたので、コピーしたときに文字化けしている……。しかも一文字だけってのが怖い。

Mavenのデフォルト設定の確認

アプリケーションだけでは文字化けは発生していなかったので、Mavenを疑って、とりあえずデフォルト設定を確認してみる。

platform encoding: MS932 おまえかー!

対処法

pom.xmlのpropertiesタグに以下のようなエンコードの設定を追加することで、文字化けせず、ファイルが置換されるようになりました。
(上の設定方法の紹介では、この設定は織り込み済みです。)

Maven:エンコーディング設定 – Web系開発メモ

Maven の pom. xml で、ソースやレポート出力の エンコーディング を設定したいときがあります。設定方法はいくつかありますが、良さそうな設定方法を調査してみました。 次のように、pom. xml の プロパティで設定するのが良さそうでした。 UTF-8 UTF-8 プロパティで設定をしておけば、 プラグインの エンコーディング 設定(下のような設定)を省略できるからです。 org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 maven-resources-plugin, maven-compiler-plugin などの プラグインは、プロパティの エンコーディング 設定を参照するみたいです。 エンコーディング設定をしていないと、 Maven 実行時に次のような警告が出てきたりします。 ・・・ [INFO] — maven-resources-plugin:2.6:resources (default-resources) @ poml — [WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i.e.

おそらくなんですけど「maven resources plugin」(maven-resources-plugin)がコピーするときのエンコードがデフォルトのMS932を使っていて、UTF-8の「言」の一部が消えてしまったんじゃないかなぁと思っています。

まとめ

今回、リリースする環境が複数になってきていて、手作業が面倒だなぁということから始まったMaven設定方法がんばってみました。
自分たちの手作業を減らして、アプリがよりよくなるような時間を割くことができるといいですよね!ぜひ参考にしていただければうれしいです。

参考資料

先人の方々のサイトやブログで作ることができました。リンクを持って感謝!かんしゃ!

6. プロファイル

Java,データベース,SQL,XML,Rubyなどの情報を発信。Webアプリ開発エンジニアのための技術情報サイト[TECHSCORE]

Maven2で環境に合わせて設定ファイルを切り替える方法(改訂版) – TrinityT’s LABO

新 案件でpom. xmlの設定を見直したら、 以前のエントリ の方法が冗長だったので書き直し。 各環境で共通の設定部分をprojectタグ直下のbuildタグ内にまとめたことで、よりDRYな構成となった。 1.resourcesフォルダ以下のように分け、上書き変更したいファイルを置く。 src/main/resources/config.properties (開発) src/integration/resources/config.properties (結合テスト環境) src/production/resources/config.properties (本番) 2.pom. xml を以下のように記述 (※2008/5/21 一部修正) 3.本設定を行ったプロジェクトで、 Mavenコマンドの-P オプション を変更することで設定変更可能となる ※例:warファイルのクリーンパッケージング $ mvn clean package (開発環境用) $ mvn clean package -Pintegration (結合テスト環境用) $ mvn clean package -Pproduction (本番環境用)

maven-war-pluginで環境ごとの設定ファイルを管理してみた – Challenge Java EE !

開発フェーズは終わり、細かい残作業の片づけと、結合試験の準備が始まりました。 で、前々から頭の中で「どうするのが楽なんだろう…」と思っていた 環境ごとにwarに含む設定ファイルをどうやって切り替え、管理するかなぁ… という疑問に着手しました。もっと早い段階から考えてやっとけよ!と自分で突っ込みつつ…恒例の「時間がなかったんです」という言い訳(^^; …

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

アプリケーションの開発中、開発用のモジュールとリリース用のモジュールで、設定ファイル等を書き換えたいというケースは多いと思う。代表的な例だとDBへの接続。開発中はJDBCのDriverManagerで接続し、リリース時はJNDIからDataSourceを取得とか。Maven2ではそういった環境に依存する設定をProfileという概念で環境毎に定義できる。pom.xmlに release …

Maven:エンコーディング設定 – Web系開発メモ

Maven の pom. xml で、ソースやレポート出力の エンコーディング を設定したいときがあります。設定方法はいくつかありますが、良さそうな設定方法を調査してみました。 次のように、pom. xml の プロパティで設定するのが良さそうでした。 UTF-8 UTF-8 プロパティで設定をしておけば、 プラグインの エンコーディング 設定(下のような設定)を省略できるからです。 org.apache.maven.plugins maven-resources-plugin 3.0.2 UTF-8 maven-resources-plugin, maven-compiler-plugin などの プラグインは、プロパティの エンコーディング 設定を参照するみたいです。 エンコーディング設定をしていないと、 Maven 実行時に次のような警告が出てきたりします。 ・・・ [INFO] — maven-resources-plugin:2.6:resources (default-resources) @ poml — [WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i.e.

蛇足:上の指定を全部入りするとこんな感じ

シェアする

 - Tips ,