Play Frameworkの最新版2.1.1で遊んでみた

Play Framework(以下Play)は、JavaとScalaの両言語に対応した、Ruby on Rails(以下Rails)ライクなMVC型フレームワークだ。両言語ともJVM上で動作するので、Scala側からJavaライブラリを利用することもできるし、その逆も可能。

最新版2.1.1が出たようなので、さっそくUbuntuローカル環境で試してみた。

JDKのセットアップから新規プロジェクトの作成まで

Ubunuの場合、デフォルトでは、JDK(Java Development Kit)がインストールされていないので、次の一連のコマンドを実行して、JVM環境を用意するところから始める。

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer

続いて公式サイトのダウンロードコーナーから最新版のPlay Frameworkをダウンロードして、これを任意の場所に解凍する。例えば、/home/hogeに解凍する場合は次のとおり。

$ unzip play-2.1.1.zip -d /home/hoge

指定した場所にplay-2.1.1というフォルダができるので、ホームディレクトリの.bashrcや.profile(Ubuntuならこちら)にコマンドパスを通す。

$ echo "export JAVA_HOME=/usr/lib/jvm/java-7-oracle" >> .profile
$ echo "export PATH=$PATH:/var/private/play-2.1.1" >> .profile

ここで、いったんログアウト(Ubuntuの場合)して、再ログイン後、新規プロジェクトを作成する。

$ play new MyApps

PlayNewProject01

プロジェクト名の再確認があるので、問題なければ、何も入力しないで、エンターキーを押す。

PlayNewProject02

次に、使用する言語をScalaにするかJavaにするかを選択する。今回はJavaを選択したいので、2と入力してエンターキーを押す。

ビルトインサーバーの起動

新規作成したプロジェクト内(今回の場合だと/home/hoge/play-2.1.0/MyAppsフォルダ)で、次のコマンドを実行するとビルトインサーバーが立ち上がる。

$ play run

ブラウザからhttp://localhost:9000にアクセスして、こんな画面が表示されたら、取り敢えずインストールは成功。

PlayWelcome

この辺りは、Railsでrails serverコマンドを実行して、http://localhost:3000にアクセスするのとまったく同じ感覚だ。ただ、Playの場合、はじめてプロジェクトを立ち上げるときは、中間言語へのコンパイル時間がかかってしまう。もちろんこれは初回のみで、以後、ソースコードを変更してブラウザで再読み込みすれば、Play側が自動でコンパイルしてくれる。

なお、このPlayのビルトインサーバーは、開発用途だけでなく、本番環境でも使えるほど高速(自分でテストしたわけではないが)といわれている。ビルトインサーバーが使用するポート番号はデフォルトで9000だが、次のコマンドでポート番号を変更(今回の場合は9800へ変更)することもできる。

$ play "run 9800"

データベースの設定

Playには、デフォルトでDB「H2」というデータベースが用意されている。これは、メモリ上で動作するデータベースで、特に設定しなくても動作してくれる。ただし、DB「H2」は、記録のすべてをメモリ上に保持するので、PCをシャットダウンすると内容が消えてしまう。

そこで、先ずはconf/application.conf内に記述されているデータベースの基本設定を書き換えておこう。36行目辺りにある次の2行のうち、2行目にあるmemをfileと書き換えると、シャットダウン後もファイル内に記録が残るようになる。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"

なお、お試し段階や開発初期の段階では、このDB「H2」でも事足りるかもしれないが、本番環境に移行するまでには、本格的なデータベースを用意しなければならなくなる。MySQLを利用したいときは、上記2行をコメントアウト又は削除して、application.conf内に次の2行を追加する。

db.default.driver=com.mysql.jdbc.Driver
db.default.url="mysql://[ユーザー名]:[パスワード]@[サーバー名]/[データベース名]?characterEncoding=UTF8"

上記のapplication.confファイルの設定を弄る前に、MySQLのアカウントを作っておく必要がある。例えば、サーバー名がlocalhost、データベース名がplayDB、ユーザー名がhoge、パスワードがhogehoge123だとしたら、上記2行目は次のようになる。

db.default.url="mysql://hoge:hogehoge123@localhost/playDB?characterEncoding=UTF8"

次に、project/Build.scalaファイル中のに、「”mysql” % “mysql-connector-java” % “5.1.24”」という1行を追記(6行目がそれ)する。

val appDependencies = Seq(
    // Add your project dependencies here,
    javaCore,
    javaJdbc,
    javaEbean,
    "mysql" % "mysql-connector-java" % "5.1.24"
  )

ビルトインサーバーを再起動すれば、MySQLドライバーを自動でインストールしてくれる。つまり、このBuild.scalaファイルがRailsでいうGemファイルの役割を担っているということになる。

テンプレートエンジン用言語としてのScala

実は、以前、これからはScalaだって人に勧められて、Playをインストールして遊ぼうとしたことがあったが、結局、何もしないまま、ハードディスクの肥やしで終わらせてしまったという苦い思い出がある。

当時は、言語にJavaを選択すると、テンプレートエンジン用言語としてGroovyが使われていて、何だか中途半端な感じ(それならGrailsでいいじゃんという感じ)がして、試してみる気になれなかったが、バージョン2.0以降は、Groovyに代わってScalaがテンプレートエンジン用言語になっている。

Scalaは、オブジェクト指向言語と関数型言語の特徴を統合したというマルチパラダイム言語と呼ばれている。壮大な仕様の言語なので、本来は、それなりの学習コストは覚悟しておかなければならないが、PlayでJavaを選択した場合、Scalaはあくまでもテンプレートエンジン用言語なので、ユーザーがScalaを完璧にマスターする必要はない。

テンプレートエンジンについては、好みの問題もあるだろうし、新しい言語なんて覚えたくないという人もいるだろうが、そういう人には、プラグインを使ってJavaでお馴染みのVelocityなどに変更するという方法もある。但し、このプラグイン、たぶんまだバージョン2.1には対応していない。

Javaプログラマもそうでない人もとにかく遊んでみよう

いずれにしても、Playという名称のとおり、何かと遊べるフレームワークであるのことは間違いない。お仕事プログラム言語という印象の強いJava(実際そうなのだが)のフレームワークのなかにあって、Railsライクな遊び心があるフレームワークというのは貴重な存在だ。それに、PlayがJSPやサーブレットを必要としないフルスタックのフレームワークだという点も見逃せない。

ただ、バージョンアップのたびに、結構簡単に後方互換性を捨ててしまう傾向があるので、仕事で使う場合はどうなのかなという点や、どちらかというとJavaよりScalaに重点を置いているところは、javaプログラマにとって微妙なところかもしれない。

それでも、こうした気になる点を補って余りある魅力がPlayにはある。かえって非Javaプログラマが使うと、いろいろと新しい発見があるかもしれない。遊びのなかから新しいアイデアが生まれるというのことはよくある話だ。

【追 記】
Play Frameworkのバージョン2.3.0以降を使用する際は、この記事中のplayコマンドをactivatorコマンドに読み替えてください。詳細については、「ActivatorベースになったPlay Framework 2.3.1のセットアップ」というタイトルで記事も書いています。