No Bugs, No Life

読んだ本や、プログラミング、システム開発等のねたを中心に。文章を書く練習なので少し硬派に書くつもりだけど、どうなることやら。

Template Engineの比較(Java)

MementoWeaverもそろそろメメントの生成処理を実装する時期になったようなので、採用するテンプレートエンジンを選定する。
最低の条件としては、Java SEから使用可能であることのみ。
MWの前身であるHPCMSではApache Velocity(1.6.2)を使用していた。
特にVelocityに不満があるわけでもないが、結局のところ今回はスクラッチから作り直しているので、HPCMSのvelocityテンプレートもそのまま流用というわけにはいかず、一応比較してみることにする。

選択肢

簡単にググッてみたところ、メジャーなものには以下がありそう。
最低条件はJavaSEからの利用だが、他の評価軸としては以下を考慮したい。

  • コミュニティの活発度
  • 対応するテンプレートの種別
  • 導入に伴うハードルの高さ

コミュニティの活発度(2013.3.20現在)

選択肢 公式ページ Version 最終更新
Apache Velocity Apache Velocity Site - The Apache Velocity Project 1.7 2010.11
FreeMarker FreeMarker: Java Template Engine Library - Overview 2.3.19 2012.2
Thymeleaf Thymeleaf: java XML/XHTML/HTML5 template engine 2.0.16 2013.2
Mayaa JavaServer Templates "Mayaa" 1.1.30 2013.1
Mustache.java spullara/mustache.java · GitHub (github) (github)

こう比較するとVelocityの更新が滞っていることが目立つ。
Mustache.javaはGitHub上でリポジトリが公開されているのみで、特にリリースバージョンとかを切っている様子ではなさそう(きちんと調べていない)。

対応するテンプレートの種別

上記5種の選択肢のうち、以下は使用シーンが特定されている様子。

Thymeleaf
XML,HTML,HTML5に特化*1
Mayaa
HTML*2。というか、よく見るとサーブレット環境を想定しているようなので今回は候補から外す。

導入に伴うハードルの高さ

Velocity
Commonsなどのライブラリに依存関係があるけど、ダウンロードパッケージ内にvelocity-1.7-dep.jarとして依存関係解決済みのjarがある(前回もそれを使った)ので、単純に1つのjarにクラスパスを通すだけ。(788KB)
FreeMarker
こちらもダウンロードパッケージ内にlib/freemarker.jarがあるのでそこにパスを通すのみ。(910KB)
Thymeleaf
こちらは以下のライブラリに依存している。何れもダウンロードパッケージにバンドルされている。(本体:694KB,+依存Lib:891KB)
  • ognl 3.0.5 or later
  • javassist 3.16.1-GA or later
  • slf4j 1.6.1 or later
Mustache.java
GitHubなのでツリーをcloneするのは簡単だけど、「Don't build, use Maven dependencies」と書かれている...。Mavenを常用していないので若干ハードル高し。

結論(Justification)

  • Mavenを必要とするMustache.javaは(自分にとっては)導入のハードルが高い。
  • MW以外でもテンプレートエンジンを利用する機会は想定されることからHTML/XML系に限定されるThymeleafは次点。依存ライブラリが多いのも一寸評価が下がる。
  • Apache Velocityは最終リリースが3年前。活発度については不安が残る。
  • FreeMarkerは約1年前にリリース。SourceForge上も2012.12月に更新されているが、「This release contains two important security workarounds that unavoidably make it obvious how some applications can be exploited. 」がまだ解消されていないという点で活発度については疑問符がつく。

現時点では一長一短ではあるのだが、Mavenを要するMustache.javaは今回は見送り。
汎用テンプレートエンジンであることを評価し、Thymeleafは見送り。
活発度はFreeMarkerの方が比較的高いように見受けられるが、セキュリティ上の問題が顕在化して対応しきれていない点を考慮して、Velocityを今回は採用する*3こととする。

*1:引用:「It is an XML / XHTML / HTML5 template engine (extensible to other formats) that can work both in web and non-web environments. 」

*2:引用:「HTML をテンプレートとして使う Web テンプレートエンジン」

*3:前回もVelocityだったので今回は新しいエンジンを使ってみたかったんだけど