Активы не упакованы публично/, но ниже META-INF// в Play 2.4

Мы находимся в процессе обновления нашего приложения с Play 2.3 (.10) до Play 2.4 (.6). В среде разработки активы обнаруживаются и развертываются, как и ожидалось. Однако в развертывании их нет. Мы используем sbt-native-packager 1.1.1 и activator clean stage на этапе сборки. Сгенерированные файлы работают, но активы не копируются в каталог /public ни в одном из сгенерированных JAR-файлов. Вместо этого я нахожу их в некоторых каталогах с именем

META-INF/resources/webjars/<project>/
  <branch>-<commit>-<builddate>/javascripts/jquery-2.1.1.min.js

в сгенерированном файле <projectname>-assets.jar. С Play 2.3 этот JAR содержит файл сверху, как

public/javascripts/jquery-2.1.1.min.js

как и ожидалось.

В результате активы не найдены и выдается ошибка 404. Маршрут обычный

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

В шаблонах ресурс упоминается как

<script type="text/javascript" src="@routes.Assets.at("javascripts/jquery-2.1.1.min.js")"></script>

что приводит, как и ожидалось, к

<script type="text/javascript" src="/assets/javascripts/jquery-2.1.1.min.js"></script>

в сгенерированном HTML, доставленном в браузер. Насколько я вижу, все именно так, как описано в документации. В среде разработки все работает. Но после развертывания кусочки не складываются...

Что здесь происходит? Почему я получаю что-то с «webjars» в пути, когда мы вообще не используем webjars? Почему активы не находятся в «общественности»? Как я могу заставить это работать? Есть ли какой-то плагин или настройка sbt?

ОБНОВЛЕНИЕ 2016-06-02

Тем временем мы обнаружили, что активы генерируются в первую очередь правильно:

[info] Packaging /home/xy/workspace/<project>/target/<project>-<version>.jar ...
[debug] Input file mappings:
[debug]         public/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js
[debug]           /home/xy/workspace/<project>/public/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js

Однако позже в процессе stage тот же файл создается снова — и теперь с неправильным расположением файлов:

[info] Packaging /home/xy/workspace/<project>/target/<project>-<version>.jar ...
[debug] Input file mappings:
[debug]         META-INF/resources/webjars/<project>/<version>/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js
[debug]           /home/xy/workspace/<project>/public/javascripts/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js

Я уже тестировал ручное изменение файла JAR после завершения сборки sbt: если я перемещу этот каталог META-INF/resources/webjars/<project>/<version> в простой public/ и переупакую JAR (вне sbt), все будет работать отлично. Итак, у меня готов "план Б", но мне бы очень хотелось понять, (а) почему sbt работает неправильно и (б) как заставить его работать правильно...


person Dirk Hillbrecht    schedule 01.06.2016    source источник


Ответы (1)


Хорошо, мы наконец получили это. Глубоко в нашем постоянно растущем build.sbt был этот хороший фрагмент:

// Name of the produced artifact
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
  artifact.name + "-" + module.revision + "." + artifact.extension
}

Это произошло на одном из самых, самых первых этапов нашего перехода к СБТ в качестве инструмента сборки еще в 2013 году. Возможно, это даже было из официального руководства Play или СБТ того времени (Play 2.1, СБТ 0.12...). Он сохранился до наших дней. И это привело к тому, что <project>-<version>-assets.jar, содержащий активы ниже public/, было ложно названо <project>-<version>.jar. Позже настоящий <project>-<version>.jar с ресурсами ниже META-INF перезаписал JAR-файл, содержащий ресурсы. И вот как все пошло не так.

Исправление состояло в том, чтобы отключить - или лучше: удалить - это определение artifactName из build.sbt. Теперь все в порядке, и мы, наконец, можем продолжить переход на Play 2.4.

person Dirk Hillbrecht    schedule 02.06.2016