Play2,Scala:加载资源在生产模式下不起作用

时间:2012-09-08 12:25:03

标签: scala playframework-2.0

在控制器类中,我需要加载一个文本文件。我将此文件放在public文件夹中并编写了一个对象,该文本文件以字符串形式提供。

object FooResources {
  def load(filePath: String): String = {
    Play.getExistingFile(filePath) match {
      case Some(file) => Files.readFile(file)
      case _ => throw new IOException("file not found: " + filePath)
    }
  }
}

在控制器类中,我只需调用:

val js = FooResources.jsTemplate("public/jsTemplate.js")

这在DEV模式下工作正常,但是当我通过play clean compile stage暂存项目并从./start开始时,我在尝试加载文件时会收到异常。

更新: 当我从sbt(或play)中通过start命令启动项目时,文件已成功加载。只有当我通过目标目录中的./start启动应用程序时,它才不会。

1 个答案:

答案 0 :(得分:4)

当您使用diststage目标时,您的资源会包含在Jar文件中,而不是文件系统中。

因此,您必须使用相对于类路径的输入流。为此,请查看Play object中的Play.api.resourceAsStream()方法。

也许这样的事情(没有测试过)

object FooResources {
  def load(filePath: String): InputStream = {
    Play.resourceAsStream(filePath) match {
      case Some(is) => scala.io.Source.fromInputStream(is).getLines().mkString("\n")
      case _ => throw new IOException("file not found: " + filePath)
    }
  }
}