技術メモブログ

技術ネタの備忘録的なブログ。技術ネタ以外にも気になったことをつらつら書きます

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 タスク外ってのはこんな感じ

gistefbce088efb1a9324b09

 

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