Как ссылаться на экспортированные активы в мультимодульном игровом проекте

У меня есть многомодульный проект Play Framework с двумя модулями, common который является стандартным проектом, содержащим повторно используемый код и ресурсы, и app это игровой проект, который я пытаюсь запустить. Используя плагин Sbt-Web, я могу создавать и изменять ресурсы в common/src/main/public которые копируются в папку app/target/web/web-modules/main/webjars/lib/common каждый раз, когда приложение перезагружается. Моя проблема связана со ссылками на эти ресурсы в моих представлениях Play. мой routes файл содержит строки

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

и я пытаюсь получить доступ к этим экспортированным активам в моем index.scala.html файл в app например,

<link rel="stylesheet" media="screen" href="@routes.WebJarAssets.at(WebJarAssets.locate("common/css/directives.css"))">

Этот файл существует в app/target/web/web-modules/main/webjars/lib/common/css/directives.css но WebJarAssts.locate возвращается

{"status":{"errors":[{"message":"common/css/directives.css could not be found. Make sure you've added the corresponding WebJar and please check for typos."}]}}

Я попытался указать все больше и меньше пути, а также получить доступ к нему в качестве стандартного актива через Assets.at, но не повезло. Кто-нибудь знает, как правильно ссылаться на экспортируемые активы?

Соответствующие строки из моего build.sbt файл

val playVersion = play.core.PlayVersion.current

lazy val common = project.enablePlugins(SbtWeb, SbtTwirl).settings(
    libraryDependencies ++= Seq(
        "com.typesafe.play" %% "play" % playVersion % "provided",
    )
)   

lazy val app = project.enablePlugins(PlayJava).settings(
    libraryDependencies ++= Seq(
        "org.webjars" %% "webjars-play" % "2.3.0"
    )
).dependsOn(common % "compile->compile;test->test")

lazy val suite = project.in(file(".")).aggregate(common, app)

1 ответ

Решение

Я считаю, что нашел правильный способ использования своих экспортируемых активов. Я был на неверном пути, рассматривая их как веб-фляги в моих представлениях Play; документация Sbt-Web немного вводит меня в заблуждение в этом отношении:

Ресурсы экспортируются в формате webjar и импортируются так же, как и другие зависимости webjar.

Оказывается, что экспортируемые активы доступны в двух местах, (1) в app/target/web/web-modules/main/webjars/lib/common как описано в моем вопросе и (2) в app/target/web/public/main/lib/common, Я не смог получить доступ к первому с помощью плагина webjar-play, но последний доступен как обычный ресурс, например:

<link rel="stylesheet" media="screen" href="@routes.Assets.at("lib/common/css/directives.css")">

Насколько я понимаю, это также будет работать в производстве.

Другие вопросы по тегам