2013-04-30 2 views
10

Что мы делаем:

Мы запускаем приложение PLAY2 на Cloudbees и загружаем файл с «/» конф каталога (внутри пути к классам приложения).Загрузка файла с «/» конф каталог на Cloudbees

Этих 2 фрагментов работает в местном и 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) 

Так как загрузить файл от classpath на Cloudbees?

+0

Я думаю, что это работает на Heroku, поскольку они не запускают игру в стиле производства - они просто запускают CLI игры, чтобы запустить ее, так что только случайно она там работает. –

ответ

12

Ну, файлы в «/ конф» находятся в пути к классам, а не в файловой системе, так что нам нужно, чтобы загрузить файл таким образом:

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

Обратите внимание, что мы не ставим «конф» в файлы пути находятся в пути к классам в корне.

Обратите внимание, что в процессе производства это происходит из jar/zip, а не файла, поэтому getFile несколько вводит в заблуждение в игре.

Майкл Нил из Cloudbees открыл этот вопрос: https://github.com/playframework/Play20/issues/1079

Cloudbees документация была обновлена: https://wiki.cloudbees.com/bin/view/RUN/Playframework#HLoadingconfigfilesinproduction

+0

Не уверен, когда это было изменено в Play api, но мне пришлось использовать Play.application(). ResourceAsStream вместо Play.application.resourceAsStream – grahamrb

+0

Что делать, если я хочу файл, который не является файлом конфигурации? Мне не нравится идея помещать файлы conf-conf в conf, так что я могу получить к ним доступ через resourceAsStream() – cdmckay

+2

Файлы в каталоге 'conf /' упакованы как 'default-appname-version.jar 'внутри 'lib /'. Таким образом, правильное понимание будет заключаться в том, что все файлы внутри этого * бара по умолчанию * доступны. Однако в zip-архиве, созданном с помощью команды 'dist', есть также папка' conf/'. Файлы в этой папке 'conf /' не находятся в пути к классам. – tuxdna

1

Это кажется, что Heroku запуска игры приложения через «играть старт» или «игры перспективе», который не рекомендуется способ играть в приложения для запуска в производстве - это объясняет, почему «conf» видна там, хотя это может измениться в будущей версии игры.

2

Я использую play 2.4. То, что работает для меня

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

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

Примечание: application() называется статическим методом.

Смежные вопросы