Gradle の war タスク実行時の文字列変換と、文字コードについて
成果物をビルドする際、プロパティファイルなどの値を環境なんかに応じて変えたいといった場合、ビルドする度にファイルの値を書き換えてビルドするのはとても面倒
今回はそんな対策の内容
ソースは こちら
(Java ソースファイルなんかは適当、重要なのは Gradle 側)
ちなみにEclipse使ってるわけで、ビルドの出力先は「WebContent/WEB-INF/classes」
今回キーとなるファイル(ディレクトリ)は以下
- build/template (変換して war に追加するものがあるディレクトリ)
- build/token ( template 内にある変換ファイルの、変換値を設定したファイル のディレクトリ)
- build.gradle (ビルドファイル)
Github にあるもので war タスクを実行すれば、war が作成される
説明したいことは build.gradle 内にコメントを記載したので、ファイルを見れば大体わかるかと
これにあたり、以下のサイトを参考にさせて頂きました
Gradleでリソースファイルをフィルタリングする場合の注意点 - 猫好きモバイルアプリケーション開発者記録
ant - Gradle: Replace Tokens by finding the tokens from property file - Stack Overflow
ただ困ったことに、このままだと変換したファイル(ここではプロパティファイルとする)の文字コードが SJIS となってしまい、文字化けが発生する。
とりあえず以下、幾つか試した結果
gradle.properties でシステムプロパティとして文字コードを指定
・warタスク外でコピー
resources フォルダにコピーしたものは化ける
warの中は化ける
・warタスクでコピー
warの中で化ける
コマンドでシステムプロパティとして文字コードを指定
・warタスク外でコピー
resources フォルダにコピーしたものは化けない
warの中は化けない
・warタスクでコピー
warの中で化けない
※war タスク外ってのはこんな感じ
gradle.properties の文字コード指定で解決できるのがベストなんだが、今のところ見つかっていない
DSL みても設定できそうなものは見つからないし
ただし、コマンドから「gradlew war」として実行する場合、
「gradlew (Linux 時) / gradlew.bat (Window 時)」ファイル内で
「set DEFAULT_JVM_OPTS= -Dfile.encoding=UTF-8」
と記述しておけば、コマンドで文字コード指定を毎回指定をする手間が省ける
【2016/8/28 追記】
gradle.properties に以下の記述を書けばできた
org.gradle.jvmargs = -Dfile.encoding=UTF-8