@numa08 猫耳帽子の女の子

明日目が覚めたら俺達の業界が夢のような世界になっているとイイナ。

Google App EngineのアプリをMavenとScalaで

f:id:numanuma08:20130912022629j:plain

前置き

Webアプリを作る上で、やっぱりさくらVPSとかでデーモンを作るのよりもGAEみたいなところで動かす方がメンテとかいろいろ楽だよなぁと最近思いました。なので、ScalaでGoogle App Engineで動くコードを書くことができたら幸せだなぁと思いました。

目標

  • Google App Engineデバッグサーバーにおいて、Scalaで記述されたServletが動作をする
  • scala-ideと連携をして、import文の自動補完とかの恩恵を受けたい
  • でもコードはvimで書きたい
  • 依存関係の静的解決はしたくない
  • なのでmavenを使う
  • 本当はsbtがよかった・・・

環境

maven

#mvn -v
Apache Maven 3.1.2-SNAPSHOT (02d12423060361d5444817083c64adf276c3953e; 2013-09-08 05:20:59+0000)
Maven home: /usr/local/etc/maven
Java version: 1.7.0_25, vendor: Oracle Corporation
Java home: /usr/java/jdk1.7.0_25/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-358.el6.x86_64", arch: "amd64", family: "unix"

手順

mavenの設定

mavenGoogle App Engineアプリのひな形を作ります。幸い公式サイトにちゃんとやり方が書いてあります。

mvn archetype:generate
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 296:com.google.appengine.archetypes:skeleton-archetype #com.google.appengine.archetypes:skeleton-archetype を入力

1: remote -> com.google.appengine.archetypes:skeleton-archetype (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):1

# groupId : ユニークなアプリの識別子
# artifactId : アプリの名前
# version : バージョン
# package : パッケージ

アプリのひな形ができあがるので、Scalaのコードを書くことができるようにpom.xmlをいじります。

     <properties>
         <appengine.app.version>1</appengine.app.version>
-        <appengine.target.version>1.7.5</appengine.target.version>
+        <appengine.target.version>1.8.3</appengine.target.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>


             <version>${appengine.target.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+          <groupId>org.scala-lang</groupId>
+          <artifactId>scala-library</artifactId>
+          <version>2.10.2</version>
+        </dependency>
     </dependencies>

     <build>
         <plugins>
             <plugin>
+              <groupId>net.alchim31.maven</groupId>
+              <artifactId>scala-maven-plugin</artifactId>
+              <version>3.1.5</version>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <version>2.5.1</version>
                 <artifactId>maven-compiler-plugin</artifactId>

scala-ideの設定

scala-ideからmavenのプロジェクトをインポートします。File -> Import -> Maven -> Existing Maven Projectsからpom.xmlのあるディレクトリを指定します。

scala-ideからmavenプロジェクトをインポートして、.classpathを編集をします。

  <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
      <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/>
+           <classpathentry kind="src" output="target/classes" path="src/main/scala"/>
            <classpathentry kind="src" output="target/classes" path="src/main/java"/>
            <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
            <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
            <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
            <classpathentry kind="output" path="target/classes"/>
    </classpath>

とりあえずこれでsrc/main/scala以下のScalaのコードがScala-ideからコンパイルの対象として見られるようになり、importの補完や文法エラー時に赤線を引いてくれるとかの機能が使えるようになります。便利ですね。

また、mavenからコンパイルを行うにはmvn scala:compieデバッグサーバーを立ち上げるにはmvn appengine:devserverを実行します。環境によってはscala-ideでmavenを実行するようにしてもいいかもしれないですね。

試してないですが、JDOとかとの接続でアノテーション周りでエラーとか起こる気がするんですよね。そこは今後の課題ですね・・・。

そもそも本番環境で動くの?ってのも・・・