読者です 読者をやめる 読者になる 読者になる

White Box技術部

WEB開発のあれこれ(と何か)

【解決済み】【Scala】WindowsでGit Bash利用時のsbt文字化け問題とその対策

先日、sbtの文字化け対策に関する記事を書きましたが、実はこれだけだとまだ肝心のプログラムの出力で文字化けします。

これはプログラム上で使われている文字コードUTF-8なのに、出力先のコンソールがMS932だから起こっているのであって、それを直してあげればよいのですが・・・その流れでスクリプトを見ていたら、文字化け問題ももうちょっと綺麗に解決できそうだったので、以下に新しい手順を書いておきます。

実行環境

今回の実行環境は以下になります。

sbt起動時の文字化け対策

まずはsbtが起動できるようしましょう。前回の記事では.bashrcにJAVA_TOOL_OPTIONSを指定することで解決させましたが、これは他のJavaプログラムにも影響するので、 今回はこの設定を削除し、sbtのファイルをいじることで対応します。

sbtconfig.txtの編集

まずは前回と同様、sbtconfig.txtに「-Dfile.encoding=UTF-8」を設定します。

  • sbt\conf\sbtconfig.txt
# Set the java args to high

-Dfile.encoding=UTF-8

-Xmx512M

-XX:MaxPermSize=256m

-XX:ReservedCodeCacheSize=128m

# Set the extra SBT options

-Dsbt.log.format=true

sbtの編集

実はsbtのスクリプトはsbtconfig.txtの設定ファイルの値を使っていません。

sbtファイルの143行目辺りにコメントアウトされたJAVA_OPTSの記述がありますが、設定ファイルの値を反映させるにはこれをアンコメントする必要があります。加えてWDIR変数も宣言されていないので、宣言をこの行より前に追加する必要があります。

WDIRなのでsbt_homeの値にするのがいいと思うのですが、そうするとJAVA_OPTSの設定行中のパスに「/conf」を追加する必要があります。

-sbt\bin\sbt

# -- Windows behavior stub'd
WDIR=${sbt_home}
JAVA_OPTS=$(cat "$WDIR/conf/sbtconfig.txt" | sed -e 's/\r//g' -e 's/^#.*$//g' | sed ':a;N;$!ba;s/\n/ /g')

sbt起動時の文字化け対策終了

これで前回までと同じレベルの文字化け対策はできました。
続いて実行時の文字化け対策をしましょう。

sbt runでの文字化け対策

sbtスクリプトを見ると、実行のスクリプト記述はsbt-launch-lib.bashに書かれていることが分かるので、sbt-launch-lib.bashを編集します。

TODOでsbt-launch-lib.bashをsbtにマージしたい、みたいなことが書かれているので、いつかはsbtにマージされているかもしれません。

198行目辺りのexecRunnerでjavaコマンドを実行しているので、ここのパラメータの${java_opts}の後に「-Dfile.encoding=MS932」を追加します。${java_opts}にはすでに「-Dfile.encoding=UTF-8」が入っていますが、javaのオプションは後勝ちなので、これで出力がMS932になります。

  • sbt\bin\sbt-launch-lib.bash
  # run sbt
  execRunner "$java_cmd" \
    ${SBT_OPTS:-$default_sbt_opts} \
    $(get_mem_opts $sbt_mem) \
      ${java_opts} -Dfile.encoding=MS932 \
    ${java_args[@]} \
    -jar "$sbt_jar" \
    "${sbt_commands[@]}" \
    "${residual_args[@]}"  

文字化け解消!

これで無事文字化けもなくGit Bashからsbtを実行することができるようになったかと思います。

もちろん初めからコマンドプロンプトを使っていれば何の問題もなく動作しますけどね:)

蛇足

Windowsに開発環境を構築する際の注意として、 「インストーラーデフォルトの『Programming Files』フォルダ配下にインストールすると、 パスに半角スペースが入ってしまい、うまく動かないことがあるので避けること」 というのが昔はありましたが、最近のものはデフォルトインストールでも問題なく、特に気にしなくてもよくなってましたが、 Bash系を使うとやっぱりはまります。

というのも今回、scalaのバージョンを調べようとGit Bashで「scala -version」を叩いたところ、スクリプトでコケて見れなかったんですよね。

こっちも直すかと色々頑張ったのですが、 202行目辺りのexecCommandをechoに変えて、クラスパスを出力し、 206行目辺りの$(classpathArgs)とまるっと置換してしまうしかないようです。

自分の環境だとこんな感じです。

これ、なんとか解決しようと色々やってみたのですが、さっぱりうまくいかないので、諦めました。誰かシェルに詳しい人に期待します(´・ω・)

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  -classpath "c:\Program Files (x86)\scala\lib\akka-actor_2.11-2.3.3.jar;c:\Program Files (x86)\scala\lib\config-1.2.1.jar;c:\Program Files (x86)\scala\lib\jline-2.11.jar;c:\Program Files (x86)\scala\lib\scala-actors-2.11.0.jar;c:\Program Files (x86)\scala\lib\scala-actors-migration_2.11-1.1.0.jar;c:\Program Files (x86)\scala\lib\scala-compiler.jar;c:\Program Files (x86)\scala\lib\scala-continuations-library_2.11-1.0.2.jar;c:\Program Files (x86)\scala\lib\scala-continuations-plugin_2.11.1-1.0.2.jar;c:\Program Files (x86)\scala\lib\scala-library.jar;c:\Program Files (x86)\scala\lib\scala-parser-combinators_2.11-1.0.1.jar;c:\Program Files (x86)\scala\lib\scala-reflect.jar;c:\Program Files (x86)\scala\lib\scala-swing_2.11-1.0.1.jar;c:\Program Files (x86)\scala\lib\scala-xml_2.11-1.0.2.jar" \
  -Dscala.home="$SCALA_HOME" \
  $OVERRIDE_USEJAVACP \
  "$EMACS_OPT" \
  $WINDOWS_OPT \
   scala.tools.nsc.MainGenericRunner  "$@"

文字化け問題が出たら、これにも「-Dfile.encoding=MS932」をクラスパスの後くらいに足しておくといいんじゃないでしょうか。

こっちの件もコマンドプロンプトを使っていれば問題ないのですが、 んーでもやっぱりデフォルトパスにはインストールしないようにするべきですね。

Windowsを開発環境にするのはJStyleくらいしか利点がないなぁ。