问题
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?
回答1:
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
回答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.
回答3:
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.
来源:https://stackoverflow.com/questions/16299542/load-file-from-conf-directory-on-cloudbees