Play 2.4 中的资产未打包在 "public/" 中,但低于 "META-INF/.../"

Assets are not packaged in "public/" but below "META-INF/.../" in Play 2.4

我们正在将我们的应用程序从 Play 2.3(.10) 升级到 Play 2.4(.6)。在开发环境中,资产按预期找到并部署。然而,在部署中,它们不是。我们在构建步骤中使用 sbt-native-packager 1.1.1 和 activator clean stage。生成的文件有效,但资产不会复制到任何生成的 JAR 中的 /public 目录中。相反,我在一些名为

的目录中找到它们
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" 的东西?为什么资产不在 "public" 中?我怎样才能让这个工作?是否有一些插件或 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

我已经测试过在 sbt 的构建完成后手动修改 JAR 文件:如果我将那个 META-INF/resources/webjars/<project>/<version> 目录移动到一个简单的 public/ 并重新打包 JAR(在 sbt 之外),一切正常出色地。所以,我已经准备好 "plan B" 但我真的很想了解,(a) 为什么 sbt 在这里运行错误以及 (b) 如何让它正确运行...

好的,我们终于明白了。深深埋藏在我们不断成长的 build.sbt 中,有这样一段精彩的片段:

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

它来自我们在 2013 年过渡到 sbt 作为构建工具的第一个阶段。它甚至可能来自当时的官方 Play 或 sbt 教程(Play 2.1,sbt 0.12 ...)。它一直存活到今天。并导致包含public/以下资产的<project>-<version>-assets.jar被错误命名为<project>-<version>.jar。后来 real <project>-<version>.jar 的资产低于 META-INF 覆盖了包含资产的 JAR 文件。事情就是这样出错的。

修复是禁用 - 或者更好:删除 - build.sbt 中的 artifactName 定义。现在,一切都很好,我们终于可以继续迁移到 Play 2.4。