前置き
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"
- scala-maven-plugin
- Scala IDE for Eclipse -- Build id: 3.0.1-vfinal-20130718-1727-Typesafe
手順
mavenの設定
mavenでGoogle 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とかとの接続でアノテーション周りでエラーとか起こる気がするんですよね。そこは今後の課題ですね・・・。
そもそも本番環境で動くの?ってのも・・・