sbtとEclipseの共存

Ken published on
9 min, 1759 words

Categories: Tips

また海藻猫が騒いでいたのを見つけてしまったのが運の尽き…。 [blackbirdpie id="126122863177633793"]

Android開発はやったことがないからわからないけど、Scala + Eclipseは使っているから、簡単に手順を書いておく。

■ teaplanet/sbt-appengine-eclipse - GitHub https://github.com/teaplanet/sbt-appengine-eclipse 以下の手順で作るふたつのbuild.sbtはGitHubに置いといた。

前提

sbtとEclipseを使ってAppEngineの開発を行う。 テストにはspecs2を使うことを想定してるので、specs2がいらない場合は後述のbuild.sbtからspecs2の依存関係消してね。

こんな役割分担で使ってます。 依存関係解決:sbt エディタ:Eclipse コンパイル:Eclipse(, sbt) テスト:Eclipse(, sbt) デバッグ:Eclipse こんな構成で行います。

ライブラリの依存関係の解決はsbtに任せる。ついでにEclipseのプロジェクトファイル(.project)の生成もsbtに任せる。 Eclipseはエディタとして使いつつ、同時にコンパイルも行う。 テストしつつデバッグもEclipseで行ってる。 基本的にどちらを使ってもいいんだけど、個人的にはこうやって使ってる。

依存関係の解決をsbtがやってくれるもんだから、バージョン管理にバイナリが含まれなくて精神衛生上よい。 プロジェクトをコンパイルするにもコンソールだけで済むし(Eclipse不要)。

環境

Mac OS X 10.7.1 Scala 2.9.1 sbt 0.11.0-RC1 Eclipse Indigo

開発環境構築

sbtの入手

■ Index of ivy-snapshots/org.scala-tools.sbt/sbt-launch/0.11.0-RC1 http://repo.typesafe.com/typesafe/ivy-snapshots/org.scala-tools.sbt/sbt-launch/0.11.0-RC1/ コンパイルしてもいいけど、持ってきた方が楽。今はこれを使ってます。 違うバージョンでも問題ないかもしれないけど、他のバージョンを使ってたらsbteclipseが動かなかった。

sbtのインストール

入手したsbt(sbt-launch.jar)を実行するために ~/bin/sbt ファイルを作成する。
java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"
chmod u+x ~/bin/sbt
実行権限付けて、実行できるようにする。

プロジェクト作成

プロジェクトは "ws/sample" に作ることにする。
mkdir -p ws/sample
cd ws/sample
sbt
これでsbtで必要なファイルが作成され、sbtのプロンプトが表示されているはず。 aboutって入力するとsbtやScalaのバージョンが表示されます。

プロジェクト定義

プロジェクト定義ファイルであるbuild.sbtを作る。 このファイルを作るときはエディタで作ってもいいし、別コンソールからviで作ってもいい。このあともちょくちょくsbtでコマンドを実行するので、sbtプロンプトは残しておいた方が便利だと思う。 ws/sample/build.sbt
name := "sample"

version := "1.0.0"

scalaVersion := "2.9.1"

organization := "teaplanet"

// for Specs2
resolvers ++= Seq("snapshots" at "http://scala-tools.org/repo-snapshots",
                                "releases" at "http://scala-tools.org/repo-releases",
                                "releases" at "http://repo1.maven.org/maven2/")

libraryDependencies ++= {
        val appEngineVersion = "1.5.5"
        Seq(
                "com.google.appengine" % "appengine-api-1.0-sdk" % appEngineVersion,
                "com.google.appengine" % "appengine-api-stubs" % appEngineVersion % "test",
                "com.google.appengine" % "appengine-api-labs" % appEngineVersion % "test",
                "com.google.appengine" % "appengine-testing" % appEngineVersion % "test",
                "com.google.appengine" % "appengine-tools-sdk" % appEngineVersion % "test",
                "org.specs2" %% "specs2" % "1.6.1" % "test",
                "org.specs2" %% "specs2-scalaz-core" % "6.0.1" % "test",
                "junit" % "junit" % "4.9" % "test"
        )
}

build.sbtの空行は大切。

このファイルを作成したら、sbtプロンプトへ戻る。

reload
update

reloadコマンドで更新したファイルを読み込み、updateコマンドで設定を反映する。 初回は依存ライブラリをダウンロードするから時間がかかると思うので、しばし待つ。 ここまででAppEngineの開発が出来る状態になってる。

sbteclipseプラグインを導入する

Eclipseのプロジェクトファイル(.project)を作るためにsbteclipseプラグインを導入する。 ws/sample/project/plugins/build.sbt
resolvers += Classpaths.typesafeResolver

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse" % "1.4.0-RC4")

pluginsディレクトリは無いと思うので作成する。 ここでもbuild.sbtの空行は意味があるので注意。

またsbtプロンプトへ戻ってお約束のコマンド。

reload
update

これでsbteclipseの導入が完了。

ecl[TAB]

と打って "eclipse" と補完されるようであれば正常に導入されてる。

.projectを作るために次のコマンドを実行する。

eclipse create-src

EclipseでScalaを使う準備

■ Scala IDE for Eclipse http://www.scala-ide.org/ EclipseでScalaを使うためにScala IDE for Eclipseをインストールしておくこと。

Eclipseの設定でbuildmanagerとしてsbtを使う設定ができる。 でも、これが役に立っているかはわかっていない…。

■ Using the Google Plugin for Eclipse - Google App Engine - Google Code http://code.google.com/intl/en/appengine/docs/java/tools/eclipse.html#Installing_the_Google_Plugin_for_Eclipse ライブラリの依存関係はsbtで解決してるので、こっちは必要ないかも。入れてあるけど。

Eclipseをエディタとして使う

sbtで.projectを作成したので、それを読み込む。 File -> Import...

Existing Projects into Workspace

"Browse..." からws/sampleディレクトリを選択。

結果的にこんな感じにAppEngineのライブラリが読み込まれた状態でプロジェクトが出来る。

ルーティン

依存ライブラリが増えた場合はbuild.sbtを修正し、reload -> updateを行う。 その後、eclipse create-srcを実行し.projectを作成。 Eclipseに反映するために、更新(F5)を行う。

この環境はsbtとEclipseの共存なので、好きな方を使えばいい。 テストの実行をリアルタイムに行いたいなら、sbtで "~test" しておけばいいし、トレース実行したいならいつものようにEclipseを使えばいい。

課題

ひとつだけ問題があって、Eclipseでテストは実行できるんだけど、sbtでコンパイルすると次のエラーが発生してテストに失敗する。
NullPointerException: No API environment is registered for this thread. (DatastoreApiHelper.java:118)
これはAppEngine絡みの問題なので、AppEngineを使わない人は出会わないだろうし、設定次第で解決できそうな気もする。

今回作ったプロジェクトはEclipseのプラグインを導入してない。導入した所で.projectファイル作成時に設定が上書きされ、消えてしまう。 ■ eed3si9n/sbt-appengine - GitHub https://github.com/eed3si9n/sbt-appengine sbt-appengineプラグインもあるんだけど、うまく動かなかったので放置してる。

実は…

このやり方、pomuさんに教えてもらったんだけどね。 [blackbirdpie id="117144635427663872"]