Play 2.1中的私有资产

4
在Play 2.1应用程序中,哪里是存储私有资产的适当位置?
所谓“私有资产”,是指应用程序使用但用户无法访问的数据文件。
例如,如果我有一个文本文件(Foo.json),其中包含每次应用程序启动时解析的示例数据,那么在项目中存储它的正确目录是什么?
Foo.json需要包含在部署中,并且需要在开发和生产中的代码中统一访问。

我现在正在苦恼类似的部署问题,非常想听听社区对此有什么看法。 - Ian McMahon
3个回答

3

一些选项:

  1. 通常文件存储在 conf 文件夹中,例如:conf/privatefiles/Foo.json
  2. 如果这些文件经常需要更改,可以考虑将其添加到应用程序配置文件application.conf中的外部文件夹路径(完整路径),这样就可以轻松编辑内容而无需重新部署应用程序:/home/scrapdog/privatefiles/Foo.json
  3. 您也可以将它们存储在数据库中,好处与前一个选项相同-易于编辑。

在所有情况下,请考虑使用内存缓存以避免每次需要时从文件系统/数据库中读取。


谢谢。#1 对我来说是唯一的选择(因为应用程序必须是自包含的)。我该如何从应用程序中统一访问文件夹(在conf/privatefiles中)? - kes
#1 这种解决方案并不是很好,因为资产不一定是配置文件。 - cdmckay
@cdmckay,虽然原帖中要求只在应用程序启动时解析文件,但我认为那只是 OP 想要配置某些东西的自定义方式... - biesior
那么像 app/assets 这样做还能正常工作并打包吗? - cdmckay

1
我只是在应用程序根目录下使用一个名为data的文件夹。您可以使用您想要的名称,或者更好的是,在配置文件中存储实际名称。
为了解决其路径问题,我使用以下代码片段:
  lazy val rootPath = {
    import play.api.Play.current
    play.api.Play.application.path.getPath
  }
  lazy val dataPath = rootPath + "/data/"

这个在生产环境中能用吗?即,当我构建分发包或部署到Heroku时,它会将此目录打包到jar文件中吗? - kes
不会被打包进你的Jar文件。你应该选择@biesior提到的第一种选项(将文件放入conf文件夹中)。 - ndeverge
@scrapdog 我只是使用 git 在生产服务器上部署所有东西。如果将来需要构建单个 jar 文件,我会将数据文件移动到资源目录,并使用 sbt 插件比如 Assembly 或 Proguard。 - paradigmatic

1
你可以像我一样,从@Marius Soutier 这里 获取答案。如果你喜欢,可以在那里点赞他的回答:
您可以将“内部”文档放在conf文件夹中,它相当于标准sbt项目中的resources
基本上,在conf下创建一个名为json的目录,并使用Play.resourceAsStream()来访问它。请注意,这会给您一个java.io.InputStream,因为您的文件将成为activator dist创建的JAR的一部分。
我的示例在视图中使用它,但您可以根据需要进行修改。
Play.resourceAsStream("json/Foo.json") map { inputStream =>
  Ok(views.html.xxx(XXX.do_something_with_stream(inputStream)))
} getOrElse (InternalServerError)

你也可以使用Play.resource(),这会给你一个java.net.URL,你可以使用getFile()从中获取java.io.File
Play.resource("json/Foo.json") map { fileURL =>
  Ok(views.html.xxx(XXX.do_something_with_file(fileURL.getFile())))
} getOrElse (InternalServerError)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接