资产不是打包在“公共/”中,而是打在Play 2.4中的“META-INF /.../”

时间:2016-06-01 12:50:42

标签: java-8 assets playframework-2.4 sbt-native-packager

我们正在将我们的应用程序从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)如何让它正常运行......

1 个答案:

答案 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。