我们正在将我们的应用程序从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”?为什么资产不是“公开”的?我怎样才能使这个工作?是否有一些插件或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之外),一切都运行良好。所以,我准备好了“计划B”,但我真的很想理解,(a)为什么sbt在这里操作错误,以及(b)如何让它正常运行......
答案 0 :(得分:0)
好的,我们终于明白了。深深埋藏在我们不断增长的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 .. )。它幸存至今。它导致包含<project>-<version>-assets.jar
以下资产的public/
错误地命名为<project>-<version>.jar
。稍后,资产低于<project>-<version>.jar
的真实 META-INF
覆盖了包含资产的JAR文件。那就是出了问题。
该修复是禁用 - 或更好:删除 - 来自artifactName
的{{1}}定义。现在,一切都很好,我们终于可以继续迁移到Play 2.4。