10

What we do :

We run Play2 application on Cloudbees and we load a file from '/conf' directory (inside the classpath of the application).

These 2 snippets work in local and at heroku

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

and

new File("conf/myfile.json")

However, on Cloudbees, we get FileNotFoundException :

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

So how to load a file from classpath on Cloudbees?

Supun Wijerathne
  • 11,964
  • 10
  • 61
  • 87
Maxence
  • 13,148
  • 4
  • 29
  • 28
  • I think it works on Heroku as they don't run play in production style - they just run the play CLI to launch it, so it is only by accident that it works there. – Michael Neale May 01 '13 at 04:01

3 Answers3

13

Well, files in '/conf' are in the classpath and not on the filesystem so we need to load the file this way :

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

Note that we don't put "conf" in the path - files in there are on the classpath in the root.

Note that in production it comes from a jar/zip, not a file - so getFile is somewhat misleading in play.

Michael Neale from Cloudbees opened this issue : https://github.com/playframework/Play20/issues/1079

Cloudbees documentation has been updated : https://wiki.cloudbees.com/bin/view/RUN/Playframework#HLoadingconfigfilesinproduction

Maxence
  • 13,148
  • 4
  • 29
  • 28
  • Not sure when this changed on the Play api but I had to use Play.application().resourceAsStream instead of Play.application.resourceAsStream – grahamrb Dec 26 '13 at 21:37
  • What if I want a file that's not a configuration file? I don't like the idea of putting non-conf-related files in the conf dir just so I can access them via resourceAsStream() – cdmckay Jan 18 '14 at 00:11
  • 2
    The files in `conf/` directory are packaged as a `default-appname-version.jar`inside 'lib/' folder. So the correct understanding would be that all files inside that *default jar* are accessible. However, there is also a `conf/' folder in the zip archive created using `dist` command. Files in this `conf/` folder are not in the classpath. – tuxdna Jul 25 '14 at 15:31
2

I am using play 2.4. What works for me was

import play.Play;
import org.apache.commons.io.IOUtils;

  String myfile = IOUtils.toString(Play.application().resourceAsStream("myfile.json"));

NOTE: application() is called as a static method.

Supun Wijerathne
  • 11,964
  • 10
  • 61
  • 87
1

It seems that Heroku run play apps via "play start" or "play run" which is not the recommended way for play apps to run in production - this explains why "conf" is visible there - although this could change in a future version of play.

Michael Neale
  • 19,248
  • 19
  • 77
  • 109