( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

NetBeansとScalaを使ってAppEngineたんといちゃいちゃする方法

俺「新しいアプリだよ。さぁ、デプロイするからAppSlotを解放するんだ…!」
appengineたん「で、でぷろい…ですか…?こんなおっきなあぷり…は、入るかな…?」
俺「今日はScalaを使ったアプリケーションなんだよ」
appengineたん「Scalaなんて…そんな変態的なこと…で、できません ///」
俺「もう遅いよ。どうだ? どんどんアプリがアップロードされていくぞ!」
appengineたん「は、入りました…。こんなおっきなアプリケーション…あついです…」
俺「よしテストだ。どんどんリクエストをおくってやるからな」
appengineたん「そ、そんなにリクエストされたら…らめぇっ!!SpinUpしちゃうぅっ!!」
俺「まだまだいくぞ。おらっ!データストアにputしてやるっ!」
appengineたん「らめぇぇ!あっ、あふれちゃうっ!!データが…quotaからあふれちゃうよぉぉっ!!」


自分の頭の悪さに絶望しました。どうみても手遅れです本当にあり(ry


ねたはさておき、Scala2.8 + NetBeans6.8で、Google App Engine/Javaの環境の作り方についてまとめました。

必要なもの

NetBeanでScala

NetBean6.8入れる

まずはNetBean6.8を入れますよ。ダウンロー丼してインスコれ!!
http://netbeans.org/downloads/

NetBeans Scala plugin

次に、NetBeans Scala pluginを入れます。
http://wiki.netbeans.org/Scala68v1#Install_with_NetBeans_6.8


ダウンロードしたファイルを適当なとこに解凍しておきます。


次に、NetBeansのメニューから[ツール]→[プラグイン]を選び、[ダウンロード済み]のタブを開きます。[プラグインの追加]ボタンを押して、先ほど解凍したNetBeans Scala pluginのフォルダを表示させ、*.nbmファイルを全て選択します。


f:id:yuroyoro:20100222153624p:image


これでインストールを押すと、プラグインがインストールされます。

MaxOSXの人は、Scala実行環境のパスを環境変数に設定しておく必要があります。


NetBeansをインストールしたフォルダ(通常は"/Applications/NetBeans/NetBeans 6.8.app/Contents/MacOS")に、environment.plistと言うファイルを以下の内容で作ります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>SCALA_HOME</key>
  <string>/Users/ozaki/dev/Scala/scala-2.8.0.Beta1-prerelease/rt</string>
  <key>PATH</key>
  <string>/opt/local/bin:/opt/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/Users/ozaki/dev/Scala/scala-2.8.0.Beta1-prerelease/rt/bin</string>
</dict>
</plist>

SCALA_HOMEには、Scala2.8をインスコしたパスを、PATHには、Scala2.8のbinディレクトリを絶対パスで追加します。このファイルを作成したら、一度ログアウトしないと有効になりませんので注意が必要です。

Scala Libraryの追加

[ツール]→[ライブラリ]を選び、"新規ライブラリ"を選びます。
名前に"Scala28"と入力し、"jar/フォルダを追加"を押して、Scala 2.8をインストールしたディレクトリにある"lib/scala-library.jar"を選択して追加します。

f:id:yuroyoro:20100222153626p:image
f:id:yuroyoro:20100222153627p:image

Google App Engin Pluginを入れる

Google App Engine SDK

まず、Google App Engine SDKが無ければダウンロー丼しておくべし。

Google App Engine Plugin

[ツール]→[プラグイン]を選び、[設定]のタブを開きます。[追加]ボタンを押して、"http://kenai.com/projects/nbappengine/downloads/download/Latest_NetBeans68/updates.xml"を追加します。

f:id:yuroyoro:20100222153628p:image


[使用可能なプラグイン]タブを開いて[カタログを再読込]すると、GoogleAppEngineのプラグインが一覧に表示されますので、全て選択して[インストール]します。

f:id:yuroyoro:20100222153629p:image




プラグインのインストール後に、GoogleAppEngineのサーバーをサービスに追加します。
左側の[サービス]タブを表示し、"サーバー"を右クリックして[サーバーの追加]を選びます。

f:id:yuroyoro:20100222153630p:image


"Google App Engine"を選択して次へ。

f:id:yuroyoro:20100222153631p:image


"Installation Location"には、Google App Engine SDKを解凍したディレクトリを指定します。

f:id:yuroyoro:20100222154249p:image

Google App Engine Libraryの追加

[ツール]→[ライブラリ]を選び、"新規ライブラリ"を選びます。


名前に"AppEngineLibs"と入力し、"jar/フォルダを追加"を押して、Google App Engine SDKを解凍したディレクトリにある"user/appengine-api-1.0-sdk.jar"を選択して追加します。

f:id:yuroyoro:20100222154250p:image
f:id:yuroyoro:20100222154251p:image

サンプルプロジェクトを動かしてみる

Google App Engine SDKに付属しているサンプルアプリを動かしてみましょう。
[プロジェクト]→[新規作成]を選び、"サンプル"の中にある"Google App Engine"のGuest Bookを選びましょう。

f:id:yuroyoro:20100222154252p:image


できたプロジェクトを実行すると、ブラウザで動作が確認できます。

ScalaでApp Engineを動かしてみる

Webアプリケーションプロジェクト

では、ScalaでApp Engineを動かしてみましゅ。

[ファイル]→[新規プロジェクト]を選んで、"Java Web"の"Webアプリケーション"を選択します。

f:id:yuroyoro:20100222154253p:image


プロジェクト名などを入力して、"サーバーと設定"のところでサーバに"Google App Engine"を選んで完了です。
f:id:yuroyoro:20100222154254p:image

Scalaプロジェクト

Scalaを使う場合、Webアプリケーションプロジェクトとは別にScalaプロジェクトを用意します。このプロジェクトを先ほど作ったWebアプリケーションプロジェクトから参照させる形です。

[ファイル]→[新規プロジェクト]を選んで、"Scala"の"Scala Class Library"を選択します。
f:id:yuroyoro:20100222154255p:image


出来たプロジェクトのライブラリを右クリックして[ライブラリを追加]を選び、"AppEngineLibs"と"Scala28"を追加します。

f:id:yuroyoro:20100222154256p:image

プロジェクトを→クリックして、[新規]→[その他]から"Scala"の"Scala Class"を選んで新規作成します。
f:id:yuroyoro:20100222154257p:image

内容をこんな感じにします。

package testapp
class FirstScala {
  def someMethod() = {
    "This comes from Scala!!"
  }
}
Webアプリケーションプロジェクトを変更する

Webアプリケーションプロジェクトのライブラリを右クリックして[ライブラリを追加]を選び、"AppEngineLibs"と"Scala28"を追加します。

f:id:yuroyoro:20100222154256p:image

次に、Webアプリケーションプロジェクトのライブラリを右クリックして、[プロジェクトを追加]を選びScalaプロジェクトを追加します。

f:id:yuroyoro:20100222154258p:image

"Webページ"にあるindex.jspを修正します。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="testapp.FirstScala"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
         <p>Test: <%= new FirstScala().someMethod() %></p>
    </body>
</html>
実行

Webアプリケーションプロジェクトを実行すると、ブラウザに画面が表示されます。

f:id:yuroyoro:20100222154259p:image

もしここで、SCALA_HOMEが読み込めないというAntのエラーが出る場合は、 Scalaプロジェクトの"nbproject/build-impl.xml"を開き、-init-privateターゲットないでscala.homeを絶対パスで設定するようにしてみてください。

    <target depends="-pre-init" name="-init-private">
        <property file="nbproject/private/config.properties"/>
        <property file="nbproject/private/configs/${config}.properties"/>
        <property file="nbproject/private/private.properties"/>
        <property environment="env"/>
        <condition property="scala.home" value="${env.SCALA_HOME}">
            <isset property="env.SCALA_HOME"/>
        </condition>
        <property name="scala.home" value="/Users/ozaki/dev/Scala/scala-2.8.0.Beta1-prerelease/rt"/>
        <property name="scala.lib" value="${scala.home}/lib"/>
        <fail unless="scala.home">
                    You must set SCALA_HOME or environment property and append "-J-Dscala.home=scalahomepath"
                    property to the end of "netbeans_default_options" in NetBeansInstallationPath/etc/netbeans.conf to point to
                    Scala installation directory.
        </fail>

        
        <property name="scala.compiler" value="${scala.lib}/scala-compiler.jar"/>
        <property name="scala.library" value="${scala.lib}/scala-library.jar"/>
        <taskdef resource="scala/tools/ant/antlib.xml">
            <classpath>
                <pathelement location="${scala.compiler}"/>
                <pathelement location="${scala.library}"/>
            </classpath>
        </taskdef>

    </target>