【问题标题】:Load file from '/conf' directory on Cloudbees从 Cloudbees 上的“/conf”目录加载文件
【发布时间】:2013-04-24 08:27:52
【问题描述】:

我们做什么:

我们在 Cloudbees 上运行 Play2 应用程序,并从“/conf”目录(在应用程序的类路径内)加载一个文件。

这 2 个 sn-ps 在本地和 heroku 中工作

Play.application().getFile("conf/myfile.json")

new File("conf/myfile.json")

但是,在 Cloudbees 上,我们得到 FileNotFoundException :

java.io.FileNotFoundException: /var/genapp/apps/..../conf/myfile.json (No such file or directory)

那么如何在 Cloudbees 上从类路径加载文件?

【问题讨论】:

  • 我认为它可以在 Heroku 上运行,因为它们不会以生产方式运行 play - 他们只是运行 play CLI 来启动它,所以它在那里运行只是偶然的。

标签: playframework playframework-2.0 cloudbees


【解决方案1】:

好吧,'/conf' 中的文件在类路径中,而不是在文件系统中,所以我们需要以这种方式加载文件:

Play.application.resourceAsStream("myfile.json")
//.resource() also works - depends what we want

请注意,我们不会将“conf”放在路径中——其中的文件位于根目录中的类路径中。

请注意,在生产中它来自 jar/zip,而不是文件 - 所以 getFile 在游戏中有些误导。

来自 Cloudbees 的 Michael Neale 打开了这个问题:https://github.com/playframework/Play20/issues/1079

Cloudbees 文档已更新:https://wiki.cloudbees.com/bin/view/RUN/Playframework#HLoadingconfigfilesinproduction

【讨论】:

  • 不确定 Play api 何时更改,但我不得不使用 Play.application().resourceAsStream 而不是 Play.application.resourceAsStream
  • 如果我想要一个不是配置文件的文件怎么办?我不喜欢将非 conf 相关文件放在 conf 目录中的想法,这样我就可以通过 resourceAsStream() 访问它们
  • conf/ 目录下的文件打包为default-appname-version.jarinside 'lib/' 文件夹。所以正确的理解是 default jar 中的所有文件都可以访问。但是,还有一个conf/' folder in the zip archive created using dist` 命令。此conf/ 文件夹中的文件不在类路径中。
【解决方案2】:

似乎 Heroku 通过“播放开始”或“播放运行”运行播放应用程序,这不是播放应用程序在生产中运行的推荐方式 - 这解释了为什么“conf”在那里可见 - 尽管这可能会在未来版本的游戏。

【讨论】:

    【解决方案3】:

    我正在使用 play 2.4。对我有用的是

    import play.Play;
    import org.apache.commons.io.IOUtils;
    
      String myfile = IOUtils.toString(Play.application().resourceAsStream("myfile.json"));
    

    注意:application() 被称为静态方法。

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2018-05-12
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多