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。
我们正在将我们的应用程序从 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。