ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

IntelliJ IDEA で Playframwork の Scala モジュールを動かした

Play ScalaでWebアプリ書きたいっす。

っていうか多分来年、社内アプリとしてScala使って書くっす。なんでわざわざScalaで、とかは聞かないで。
フレームワークはLiftじゃなくてPlayを使うっす。なんでそんなマイナーなのを、とか聞かれても特に答えとか持ってないですよ。
使いたいからです。

で、僕だめグラマーなので、オートコンプリート機能がないとコードかけないんだけど、EclipseのScalaIDEはなんだか重いし、まともに補完出来ないし、だめじゃね、ってことで。

Eclipse以外の選択肢の検討

vim

まずvim+codefellowでやろうとして挫折。
スクリーンキャスト見る限りとってもよさそうなんだけど、vimをビルドしなおしたりといろいろ面倒だし動かし方が結局よくわからなかったので挫折。。

NetBeans

NetBeansいいと聞いて、この辺とかこの辺を参考に設定してPlay Scalaが動くところまで確認。
補完も上手く動くし、デバッグもできるし、大分いいです。
動かし方はリンク先を見れば特に問題なくやれると思うので、特に書きません。

IntelliJ IDEA

その後にTwittershin1さんpomuさんにIntelliJがいいよ、って教えてもらったのでIntelliJでPlay Scalaを動かせるようにしようかなと思った次第。
以下に簡単に動かし方を書いておきます。

Play Scala を IntelliJ IDEA で動かすには

まずPlay Scalaのセットアップ

何はなくともまずPlay1.1をインストールして下さい。
Play1.1は最近正式にLaunchpadからgithubに移行されました。
githubに置いてあるREADMEを見ればわかると思います。
https://github.com/playframework/play

PlayをインストールしたらScalaモジュールを追加でインストールします。

$ play install scala
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC2-90-g0f0c5cb, http://www.playframework.org
~
~ Will install scala-0.8
~ This module is compatible with: Play-1.1
~ Do you want to install this version (y/n)? 

次に下記コマンドでPlay Scalaプロジェクトの作成をしておきます。

$ play new myapp --with scala

ここまでで既にPlay Scalaは動きます。
下記コマンドで動作を確認しておきましょう。

$ cd myapp
$ play run
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC2-90-g0f0c5cb, http://www.playframework.org
~
~ Ctrl+C to stop
~ 
Listening for transport dt_socket at address: 8000
12:48:17,515 INFO  ~ Starting /Users/ikeike443/IdeaProjects/myapp
12:48:17,520 INFO  ~ Module scala is available (/Users/ikeike443/play/modules/scala-0.8)
12:48:17,810 WARN  ~ You're running Play! in DEV mode
12:48:17,953 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...

IntelliJ IDEAのセットアップ

次にIntelliJ IDEA 本体のインストールをします。
ここからCommunity Editionをインストールしましょう。

次にIntelliJのScalaプラグインをインストールします。
この辺を参考に。
Setting up the Environmentってところを読めばいいと思います。

PlayとIntelliJを統合する

Playには、標準でIntelliJに対応したセットアップコマンドが用意されています。
下記のように実行しましょう。これで、myapp.iml というファイルが生成されます

$ play idea
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.1RC2-90-g0f0c5cb, http://www.playframework.org
~
~ OK, the application is ready for Intellij Idea
~ Use File/New Module/Import Existing module
~

出来上がったimlファイルをIntelliJにインポートします。
playが出力してくれているとおり、メニューを
File/New Module/Import Existing module
と辿って、imlファイルを指定します。

これでIntelliJ上でPlayのプロジェクトを編集できるようになりました。

ところが、Eclipseであれば、Playコマンド(play ec)だけでlaunchファイルも作られて全て済むのでここで終わるはずなんだけど、IntelliJはGuillaume自身も使ってないせいか、なんか適当な扱い。。
play ideaだけじゃ動きません。

実行とデバッグ、テスト実行のための設定をしましょう

IntelliJのメニューから、
Run/Edit Configurations
と辿って、Applicationを選択し下記パラメータを設定します。

Main class:
play.server.Server 
VM parameters:
 -Dapplication.path=/Users/ikeike443/IdeaProjects/playidea
 -Djavaagent=/Users/ikeike443/play/framework/play.jar
 -Dplay.debug=yes
 -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
 -Xdebug
 -classpath /Users/ikeike443/IdeaProjects/playidea/conf:/Users/ikeike443/play/framework/play.jar:/Users/ikeike443/play/modules/scala-0.8/lib/jline.jar:/Users/ikeike443/play/modules/scala-0.8/lib/play-scala.jar:/Users/ikeike443/play/modules/scala-0.8/lib/scala-compiler.jar:/Users/ikeike443/play/modules/scala-0.8/lib/scala-library.jar:/Users/ikeike443/play/modules/scala-0.8/lib/scalatest-1.2-for-scala-2.8.0.RC7-SNAPSHOT.jar:/Users/ikeike443/play/framework/lib/activation-1.1.1.jar:/Users/ikeike443/play/framework/lib/antlr-2.7.6.jar:/Users/ikeike443/play/framework/lib/async-http-client-1.3.0.jar:/Users/ikeike443/play/framework/lib/bcprov-jdk15-145.jar:/Users/ikeike443/play/framework/lib/c3p0-0.9.1.2.jar:/Users/ikeike443/play/framework/lib/cglib-2.2.jar:/Users/ikeike443/play/framework/lib/commons-beanutils-1.8.3.jar:/Users/ikeike443/play/framework/lib/commons-codec-1.4.jar:/Users/ikeike443/play/framework/lib/commons-collections-3.1.jar:/Users/ikeike443/play/framework/lib/commons-email-1.2.jar:/Users/ikeike443/play/framework/lib/commons-fileupload-1.2.jar:/Users/ikeike443/play/framework/lib/commons-io-1.4.jar:/Users/ikeike443/play/framework/lib/commons-lang-2.5.jar:/Users/ikeike443/play/framework/lib/commons-logging-1.1.1.jar:/Users/ikeike443/play/framework/lib/dom4j-1.6.1.jar:/Users/ikeike443/play/framework/lib/ehcache-core-2.0.0.jar:/Users/ikeike443/play/framework/lib/ezmorph-1.0.3.jar:/Users/ikeike443/play/framework/lib/groovy-all-1.7.1.jar:/Users/ikeike443/play/framework/lib/gson-1.4.jar:/Users/ikeike443/play/framework/lib/hibernate-annotations-3.5.6-Final.jar:/Users/ikeike443/play/framework/lib/hibernate-commons-annotations-3.2.0.Final.jar:/Users/ikeike443/play/framework/lib/hibernate-core-3.5.6-Final-patched.jar:/Users/ikeike443/play/framework/lib/hibernate-entitymanager-3.5.6-Final.jar:/Users/ikeike443/play/framework/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar:/Users/ikeike443/play/framework/lib/hsqldb-1.8.1.2.jar:/Users/ikeike443/play/framework/lib/jamon-2.7.jar:/Users/ikeike443/play/framework/lib/javamail-1.4.3.jar:/Users/ikeike443/play/framework/lib/javassist-3.9.0.GA.jar:/Users/ikeike443/play/framework/lib/jaxen-1.1.jar:/Users/ikeike443/play/framework/lib/jj-imaging.jar:/Users/ikeike443/play/framework/lib/jj-simplecaptcha.jar:/Users/ikeike443/play/framework/lib/jj-textile.jar:/Users/ikeike443/play/framework/lib/jj-wikitext.jar:/Users/ikeike443/play/framework/lib/jodatime-1.6.jar:/Users/ikeike443/play/framework/lib/jregex-1.2_01.jar:/Users/ikeike443/play/framework/lib/jsr107cache-1.0.jar:/Users/ikeike443/play/framework/lib/jta-1.1.jar:/Users/ikeike443/play/framework/lib/junit-4.8.1.jar:/Users/ikeike443/play/framework/lib/log4j-1.2.15.jar:/Users/ikeike443/play/framework/lib/memcached-2.4.2.jar:/Users/ikeike443/play/framework/lib/mysql-connector-java-5.1.13-bin.jar:/Users/ikeike443/play/framework/lib/netty-3.2.2.Final.jar:/Users/ikeike443/play/framework/lib/org.eclipse.jdt.core_3.6.0.jar:/Users/ikeike443/play/framework/lib/oval-1.50.jar:/Users/ikeike443/play/framework/lib/provided-servlet-2.5.jar:/Users/ikeike443/play/framework/lib/signpost-core-1.2.jar:/Users/ikeike443/play/framework/lib/slf4j-api-1.6.1.jar:/Users/ikeike443/play/framework/lib/slf4j-log4j12-1.6.1.jar:/Users/ikeike443/play/framework/lib/snakeyaml-1.6.jar:/Users/ikeike443/play/framework/lib/xstream-1.3.jar
Use classpath and JDK of module:
自分のプロジェクト(myapp)

要はPlayの実行に必要なjarすべてに対してclasspathを明示的に通してやればいいです。

尚、Playの機能の一つであるテストモード実行をIntelliJでやりたい場合はテスト実行用の設定を別途コピーして作り、上記に加えてtestrunnerもclasspathに通してやればいいです。

#上記に加えて下記を追加
/Users/ikeike443/play/modules/scala-0.8/lib/scalatest-1.2-for-scala-2.8.0.RC7-SNAPSHOT.jar:/Users/ikeike443/play/modules/testrunner/lib/play-testrunner.jar

デバッグは8000番ポートに接続するようにしてやればいいので、
Run/Edit Configurations
からRemoteを選択して、下記のように設定すればいいです。

Transport: Socket
Debugger mode: Attach
Host: localhost
Port: 8000

動作を確認しましょう

これでIntelliJの上でPlay Scalaを実行、デバッグ、テスト実行ができるようになりました。
IntelliJからPlayを実行して、ブラウザからlocalhost:9000を確認して下さい。
下記のような画面が出力されていればOKです。
f:id:ikeike443:20101227135030p:image
テスト実行もできます。テスト画面はlocalhost:9000/@testsから確認して下さい。
f:id:ikeike443:20101227135031p:image
デバッグもちゃんと動きます。いい感じですね!
f:id:ikeike443:20101227135032p:image

でもまだIntelliJのことはよくわからない。。

まだIntelliJの仕組みがよくわからんけど、上記のパラメータをPlay ideaコマンド実行時に全て自動でつくりにいきたいな。。
IntelliJってその手の情報はどこに持ってるんだろう?
Play ecだとEclipseフォルダの下にlaunchファイルを作ってくれるんだけど、そういうのやりたい。

まずはIntelliJと仲良くなってからかな。。

次はPlayのテストフレームワークとAuto-Testについて書こうかなと思います。。その前にPlay自体についてもう少し紹介記事とか書いたほうがいいのかなとも思うけど。。

追記

自分も翻訳に協力していながら、このページの存在を忘れてました。
Eclipse、NetBeans、IntelliJ IDEA、TextMate、それぞれのIDEを使う際の設定の仕方など参考になるので、ここも参考にしてください。