2016-04-28 2 views
6

Приложение для игры в 2.4.2. В режиме разработчика я использовал для чтения файлов из общей папки на внешних контроллерах с использованием Source.fromFile ("./ public/files/abc.json")Чтение файлов из общедоступной папки в игровой среде в производстве

Когда я преобразовал приложение в режим производства, я получение исключений из файла не найдено. Я обнаружил, что общая папка упакована в банке активов в режиме производства. Что я могу сделать, чтобы она работала как в режиме разработки, так и в производстве?

+1

Вы можете попробовать читать его из пути к классам: http://stackoverflow.com/a/1464366/1080523 – rethab

+0

@ user1869107 "в рабочем режиме, игра class loader может читать файлы только из папки conf "-> Это неверно. На самом деле вы можете добавить другие каталоги ресурсов в структуру Play в дистрибутиве. Я отредактирую свой ответ и добавлю, как это сделать. –

ответ

4

Вы пробовали эту игру Документация https://www.playframework.com/documentation/2.5.x/AssetsOverview? Это нормально с Play 2.4 и даже с 2.3 также, я пробовал.

Здесь вы можете найти это, вы можете просто сделать это в своем файле conf/routes.

GET /assets/*file  controllers.Assets.at(path="/public", file) 

файл -> относится к имени файла. Ex: myFile.json

Чтобы сделать эту работу в режиме производства, вам нужно немного поработать. Как объяснено в ответе this, добавьте эти строки в файл /build.sbt.

import com.typesafe.sbt.packager.MappingsHelper._ 
    mappings in Universal ++= directory(baseDirectory.value/"public") 

Это будет включать ваш «общедоступный» каталог внутри файла dist (вы можете включить любой каталог таким образом). Тогда ваше приложение будет работать в производственной среде.

+1

. Директивы sbt, приведенные здесь, также работают для Play 2.3! – EdgeCaseBerg

1

Вы можете использовать этот метод:

Play.application().getFile("/public/foobar.baz"); 

Method Doc:

Получить файл относительно корня приложения пути.

+0

было полезно, потому что он указал мне на метод 'resourceAsStream' – EdgeCaseBerg

0

Play поставляется со встроенным контроллером для обслуживания государственных активов.

Контроллер доступен в Play JAR по умолчанию как controllers.Assets и определяет один в действии с двумя параметрами:

Assets.at (путь: Струнные, файл: String) Параметр путь должен быть фиксированным и определяет каталог, управляемый действием. Параметр файла обычно динамически извлекается из пути запроса.

Вот типичное отображение контроллера активов в вашем конф файле/маршрутов:

GET /assets/*file  controllers.Assets.at(path="/public", file) 

Refer here for more.

0

Есть два способа решения этой проблемы: - 1) Прямой один должен использовать то, что Supun Wijerathne предложил в комментарии выше. 2) Во-вторых, следует использовать следующий подход, если вы не хотите добавлять дополнительную общую папку в дистрибутивную версию приложения: - a) Скопируйте все файлы из общей папки в папку conf. b) Получите ресурс как поток, используя загрузчик классов Play. c) Преобразуйте этот входной поток в буферный источник, используя метод Source.fromInputStream. Теперь этот файл может использоваться контроллером для обработки.

0

Найдено решение: необходимое для вызова этих ресурсов с использованием активов/

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