如何在多模块播放项目中引用导出的资源

时间:2014-10-28 16:11:28

标签: playframework sbt webjars sbt-web

我有一个包含两个模块的多模块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.cssWebJarAssts.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 个答案:

答案 0 :(得分:1)

我相信我找到了使用我的导出资产的正确方法。我在Play视图中将它们视为webjars,这是错误的轨道; Sbt-Web documentation在这方面对我有点误导:

  

资产以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")">

据我所知,这也适用于制作。