The idea is to create SBT tasks and then, quoted from James, "get a hold of the dependencies, create a new URLClassLoader with them, load the class you want to use from that classloader using reflection, and then invoke it."
Here is the code in the SBT build file Build.scala
import java.net.URLClassLoader
object ApplicationBuild extends Build {
//Other project settings such as appVersion and appDependencies
def registerTask(name: String, taskClass: String, description: String) = {
val sbtTask = (dependencyClasspath in Runtime) map { (deps) =>
val depURLs = deps.map(_.data.toURI.toURL).toArray
val classLoader = new URLClassLoader(depURLs, null)
val task = classLoader.
loadClass(taskClass).
newInstance().
asInstanceOf[Runnable]
task.run()
}
TaskKey[Unit](name, description) <<= sbtTask.dependsOn(compile in Compile)
}
val main = play.Project(appName, appVersion, appDependencies).settings(
registerTask("seed-data-book","tasks.SeedBooks", "seed for book table" ),
registerTask("seed-data-user","tasks.SeedUsers", "seed for user table" )
)
Here is our task classes (I placed it in app/tasks)
package tasks
import play.core.StaticApplication
abstract class Task extends Runnable {
val application = new StaticApplication(new java.io.File("."))
}
class SeedBooks extends Task{
def run {
Book.dao.save(new Book("Introduction to Scala", "Martin Odersky"))
}
}
class SeedUsers extends Task{
def run {
User.dao.save(new User("jRoper", "password"))
}
}
I hope this helps. Feel free to ask any questions in the comments.
No comments:
Post a Comment