sbt-appengine is a sbt 0.10+ port of the awesome Yasushi/sbt-appengine-plugin.
export environment variables (JREBEL_PATH
is optional).
export APPENGINE_SDK_HOME=/Applications/appengine-java-sdk-1.6.2.1
export JREBEL_PATH=/Applications/ZeroTurnaround/JRebel/jrebel.jar
put the following in the project/appengine.sbt
:
addSbtPlugin("com.eed3si9n" % "sbt-appengine" % "0.6.2")
and the following in appengine.sbt
:
libraryDependencies += "org.mortbay.jetty" % "jetty" % "6.1.22" % "container"
appengineSettings
put the following in the project/plugins.sbt
:
addSbtPlugin("com.eed3si9n" % "sbt-appengine" % "0.5.0")
resolvers += "spray repo" at "http://repo.spray.cc"
for build.sbt
:
libraryDependencies += "org.eclipse.jetty" % "jetty-webapp" % "7.6.8.v20121106" % "container"
appengineSettings
for build.scala
:
import sbtappengine.Plugin._
import AppengineKeys._
lazy val example = Project("web", file("web"),
settings = buildSettings ++ appengineSettings ++
Seq( // your settings here
))
you can deploy your application like this:
> appengineDeploy
to (re)start the development server in the background:
> appengineDevServer
to redeploy development server continuously:
> ~ appengineDevServer
to hot reload development server continuously, set JREBEL_PATH
and:
> appengineDevServer
> ~ packageWar
by default development server runs in debug mode. IDE can connect to it via port 1044.
to run a code on start/stop of dev server:
(gae.onStartHooks in gae.devServer in Compile) += { () =>
println("hello")
}
(gae.onStopHooks in gae.devServer in Compile) += { () =>
println("bye")
}
you can deploy your backend application(s) like this:
> appengineDeployBackends
to start a backend instance in the cloud:
> appengineStartBackend <backend-name>
to stop a backend instance:
> appengineStopBackend <backend-name>
sbt-appengine provides experimental support for DataNucleous enhancer. to use this, include the following in build.sbt
:
appengineSettings
appengineDataNucleusSettings
gae.persistenceApi in gae.enhance in Compile := "JDO"
this will call the enhancer automatically on packageWar
task. since DataNucleous expects plain Java fields, the entity class looks a bit ugly in Scala:
import javax.jdo.annotations._
import com.google.appengine.api.datastore.Key
import scala.annotation.target.field
@PersistenceCapable
case class Counter(
@(PrimaryKey @field)
@(Persistent @field)(valueStrategy = IdGeneratorStrategy.IDENTITY)
var key: Key,
@(Persistent @field)
var count: Int)
When trying to launch the dev server with appengine-dev-server
, you might run
into the following exception: java.lang.RuntimeException: Unable to restore the previous TimeZone
.
This issue has been resolved in the latest App Engine SDK.