Ikura開発日記 2

週一で書くと決めたのにいきなり飛ばしてしまった。今後は毎週土曜日に公開することを目標としたい。

年末年始、Twirlテンプレートを実行中にコンパイルしてクラスを読み込むというのに取り組んでた。

TwirlテンプレートはコンパイルされScalaコードになる。そのScalaコードを更にコンパイルしてバイトコードにして実行時に読み込むことが必要になる。自分はこういうのが苦手だ。リフレクションとかもそう…。なんか面倒なんだよな。だから今まであんまりやってこなかったし、やるのも面倒くさい。

とりあえずTwirlのテストコードを見てみた。ここではテスト実行中にテンプレートをコンパイルして実行するという操作をしているはずだから。

CompilerSpec.scala

ただ、これをコードだけ抜き出して自分の環境で動かそうとすると実行時に「scalaという名前のオブジェクトがない」などとエラーになってしまった。scala-libraryとかscala-compilerとかを依存性に追加してみたが変わらなかった。だからリフレクションとか、こういう実行してわかるエラーって嫌いなんだよな…。

次はtwirlをcloneしてsbt testしてみた。すると…。なんと同じエラーで失敗するではないか。なぜだ。JVMのバージョンを8, 9, 10, 11と変化させても同じ。

もしかしてWindowsでやってることが原因か?と思い、Ubnuntu上でやってみると成功した。まじかよ…。年末年始はSurfaceに開発環境一式を入れてプログラミングしていたのだった。

というわけで、「動的にScalaコードをコンパイルしてその結果のクラスを読み取る」には下記にあるヘルプクラスを使用すればできる。ただしWindows上では動作しない…

CompilerSpec.scala