为什么Play Framework没有重新加载资产?

时间:2015-08-27 18:40:28

标签: scala playframework

我在开发模式下启动了我的播放应用,并试图更改索引html文件,但播放没有更新它。 我的应用程序只包含公共文件夹中的资产,并且为了查看我必须重新启动应用程序的更改。我的观察表明,play会在target/web/public/main目录中编译资产,并且在public目录中的文件发生更改时不会更新它

我应该如何配置我的应用程序,以便在更改时重新加载所有资源?

3 个答案:

答案 0 :(得分:2)

某些浏览器会将资源缓存在您的公用文件夹中,因此Play服务器将提供新内容,您仍然会看到旧内容。如果您使用Chrome,则可以通过执行硬重新加载(Ctrl + Shift + R)来清除缓存,这会强制它再次从服务器获取所有内容。

更好的解决方案是使用资产指纹识别,您可以找到有关here的信息。这基本上意味着您的资产名称会在其内容发生变化时发生变化,因此您的浏览器将意识到它需要下载新文件而不是提供缓存的文件。要做到这一点非常简单 - 在路线文​​件中,更改

GET  /assets/*file        controllers.Assets.at(path="/public", file)

GET  /assets/*file  controllers.Assets.versioned(path="/public", file: Asset)

当您需要引用资产时,请使用Assets.versioned,而不是使用Assets.at。

<link rel="stylesheet" href="@routes.Assets.at("stylesheets/main.css")">

变为

<link rel="stylesheet" href="@routes.Assets.versioned("stylesheets/main.css")">

然而,正如Kris在评论中所说,如果您要使用twirl模板系统(您的索引页面位于app / views / index.scala.html中,而不是将其作为公共文件夹中的资源)播放将在任何更改后重新编译您的模板并提供新页面。

答案 1 :(得分:2)

这真是个愚蠢的问题。我的一个子项目包含配置scalaSource in Compile := baseDirectory.value,它刚刚覆盖了scalaSource中的原始Compile。通过更改为scalaSource in ThisScope := baseDirectory.value来解决问题。

答案 2 :(得分:0)

有时您需要等待一段时间才能发现文件更改,尝试多次刷新页面以查看是否有效

此外,如果您在特殊环境中运行Play,例如从MacOS运行链接到Docker容器的代码,则需要对Play的文件更改侦听器进行一些特殊设置以使检测工作。