先日、久しぶりに scala + sbt でコードを書いていたら、どうにも compile が通らないという事態がありまして。
状況としては、JVM のデフォルトの文字コードが SJIS やらだったがために、UnmappableCharacterException が発生してしまっていたというもの。
java.nio.charset.UnmappableCharacterException: Input length = 2
at java.nio.charset.CoderResult.throwException(CoderResult.java:261)
...
java実行時のオプションとして、文字コード UTF-8 を指定することで解決しました。
-Dfile.encoding=UTF-8
sbt 起動する度にオプションで指定するのも微妙なので、sbt の設定ファイルに記述しておくことに。
Windows
コンソールからデフォルトの設定を確認。
Scala 2.9.2 + sbt 0.12.2
$ sbt console
scala> scala.io.Codec.default.charSet
res0: java.nio.charset.Charset = windows-31j
sbt/sbtconfig.txt に
-Dfile.encoding=UTF-8
を追加。
# 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 console
scala> scala.io.Codec.default.charSet
res0: java.nio.charset.Charset = UTF-8
Mac
(3/22 追記)
コメントで指摘していただいたように、起動スクリプトを直接いじるよりは ~/.sbtconfig に設定を記述するほうがスマートだと思います。
(追記ここまで)
コンソールからデフォルトの設定を確認。
Scala 2.10.0 + sbt 0.12.1
$ sbt console
scala> scala.io.Codec.default.charSet
res0: java.nio.charset.Charset = Shift_JIS
sbt 実行ファイル内に
-Dfile.encoding=UTF-8
を追加。
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Dfile.encoding=UTF-8 -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
確認は Win と同様に。
Java周りの設定に不慣れなのもあって結構寄り道しちゃったけども、解決方法を調べるのは楽しかった。
これで本筋に戻れる!