3

コントローラー クラスでは、テキスト ファイルを読み込む必要があります。このファイルを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 (または再生) 内からプロジェクトを開始するとstart、ファイルが正常に読み込まれます。./startターゲットディレクトリでアプリを起動した場合のみ、そうではありません。

4

1 に答える 1

4

distまたはターゲットを使用するstageと、リソースはファイルシステムではなく、Jar ファイル内に含まれます。

したがって、クラスパスに相対的な入力ストリームを使用する必要があります。これについては、 Play オブジェクトの 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)
    }
  }
}
于 2012-09-08T13:24:52.293 に答える