Java 如何运行使用Play Framework应用程序数据库的comand line scala脚本?

Java 如何运行使用Play Framework应用程序数据库的comand line scala脚本?,java,scala,playframework,playframework-2.0,Java,Scala,Playframework,Playframework 2.0,我在我的app/scripts文件夹中有这个文件夹(我在app/中创建了这个文件夹)。我不确定如何在这里正确设置类路径,因此我甚至没有运行它来知道它是否真的会连接到数据库。如何从命令行以干净的方式运行它 package scripts import scala.collection.TraversableOnce import scala.collection.generic.SeqForwarder import scala.io.Source import scala.slick.jdbc

我在我的
app/scripts
文件夹中有这个文件夹(我在
app/
中创建了这个文件夹)。我不确定如何在这里正确设置类路径,因此我甚至没有运行它来知道它是否真的会连接到数据库。如何从命令行以干净的方式运行它

package scripts

import scala.collection.TraversableOnce
import scala.collection.generic.SeqForwarder
import scala.io.Source
import scala.slick.jdbc.{StaticQuery => Q}
import scala.slick.session.Session
import scala.slick.session.Database
import play.api.db.DB
import tables.Campeonatos
import tables.Jogos
import org.postgresql.Driver
import play.api.test._
import play.api.test.Helpers._

// ...

class InsertJogosCSV extends App {
  val dao = new DAO()
  val application = FakeApplication()

  def insertJogos(csv: CSV)(implicit s: Session) = {
    val times = dao.getTimeIdByNameMap
    var count = 0
    csv foreach { case cols =>
      count += 1
      dao.insertJogo(cols, times)
    }
    count
  }

  val csvFilePath: String = args(0)
  val csv = new CSV(csvFilePath)
  csv.printLines
  running(application) {
    val realDatabase = Database.forDataSource(DB.getDataSource()(application))
    implicit val s = realDatabase.createSession
    insertJogos(csv)
  }
}

您可以通过使用应用程序根目录下的
playtest:console
命令来实现这一点。首先,您可以将代码移动到主方法中,而不是扩展
App

class InsertJogosCSV {
    def main(args: Array[String]) {
        val dao = new DAO()
        val application = FakeApplication()

        def insertJogos(csv: CSV)(implicit s: Session) = {....}

        ....
    }
}
然后运行
playtest:console
命令并执行以下操作

scala> import scripts.InsertJogosCSV
import scripts.InsertJogosCSV

scala> val insert = new InsertJogosCSV()
insert: scripts.InsertJogosCSV = scripts.InsertJogosCSV@7d5f9d2b

scala> insert.main
res0: .....
默认情况下,
play test:console
会将应用程序文件夹中的所有内容以及脚本所需的
FakeApplication
上下文添加到类路径中。希望有帮助


类似的问题:

我在博客上解释了我的最终解决方案。应该作为问题的答案


对于类似的任务,我正在使用另一种方法

在主playframework项目中创建空子项目

在build.sbt中,它看起来像

// Main project
lazy val root = (project in file(".")).enablePlugins(play.PlayScala).enablePlugins(com.typesafe.sbt.web.SbtWeb)
// Utils sbt project with scripts
lazy val sjutil = project.aggregate(root).dependsOn(root)
sjutil/build.sbt与普通sbt项目类似,如果需要,可以使用额外的DEP,对我来说,它是akka remote

name := "sjutil"

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.1"

libraryDependencies +=   "com.typesafe.akka" %% "akka-remote" % "2.3.4"
您可以将某些应用程序直接放置在sjiutil/文件夹中

sjiutil/actorsstarter.scala:

object actorsstarter {
  lazy val logger = play.api.Logger("actorsstarter")
  def main(args: Array[String]) {
     // read config from conf/application.conf of main project
     val remoteConfig = ConfigFactory.load.getConfig("botstarter")

     val system = ActorSystem("application",remoteConfig)
     val path = "akka.tcp://application@127.0.0.1:2553/user"
     ....
     logger.info("Started")
  }
}
之后,您可以使用以下命令运行此脚本:

./activator sjutil/run 

用普通项目做你能做的一切:舞台、舞台等等。

这肯定会有帮助。我开始学习如何创建SBT任务来执行此任务。SBT非常复杂,我还在阅读文档,以找到处理任务上文件路径参数的最简单方法。现在我将使用test:console。谢谢@Alex@philinx都有。您移动了条目还是服务器卡住了?不管怎么说,问题已经过去了。谢谢你fixing@Alex约会中的那一天被推迟了一天。我认为这是由于一些与生活在不同时区有关的错误:)