播放2.4.2 Scala controllers.Assets.at操作未找到

时间:2015-12-05 17:55:25

标签: scala playframework playframework-2.0 playframework-2.4

我正在使用Play 2.4.2和Scala。

这是我的路线档案。

GET /favicon.ico            controllers.Assets.at(path="/public", file="images/favicon.png")
GET /robots.txt             controllers.Assets.at(path="/public", file="files/robots.txt")
GET /                       controllers.Default.redirect(to = "http://www.marketingpage.local")
GET /assets/*file           controllers.Assets.at(path="/public", file)

GET /:id                    controllers.XController.method0(id: String)
GET /path/:id               controllers.XController.method1(id: String)

我正在使用注入的路由生成器。这是在我的构建中。

routesGenerator:= InjectedRoutesGenerator,

/,/:id,/ path /:id路由在开发和生产中运行良好,但在这些页面上没有任何资产在生产中返回。

进一步测试显示没有使用控制器的路由.Assets.at在生产中工作。它们在开发过程中可以在我的本地机器上运行。

在生产中,如果我尝试直接访问资产,我会得到默认的“找不到请求的动作”GET /assets/stylesheets/attachments.css'“。

因此资产请求到达Play服务器。

我已经尝试了所有可以解决此问题的方法。

我怀疑这与依赖注入有关。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

诊断此问题的一些提示:

  1. 请务必使用推荐的方式构建应用程序:Play2.4 doc - Building with dist
  2. 检查您的target目录中的sbt是否已将所有资产打包在一个专用的jar中:
  3.   

    打包应用程序时,应用程序的所有资产(包括所有子项目)都会聚合到target / my-first-app-1.0.0-assets.jar中的单个jar中。此jar包含在发行版中,以便您的Play应用程序可以为它们提供服务。此jar还可用于将资产部署到CDN或反向代理

    1. 请确保您没有错过配置build.sbt,尤其是pipelineStages(尝试一个新项目进行比较 - activator new
    2. 请确保您没有编辑/project个文件(尝试新的项目进行比较)
    3. application.conf中仔细检查您的assets.XXX值配置(删除这些配置以尝试)
    4. 确保您的前端服务器没有捕获您的/public请求

答案 1 :(得分:0)

这结果是SBT插件之间的冲突。我为旧版本的Play编写了一个自定义插件,该插件不支持sbt-native-packager,实际上,它与2.4 build系统现在使用sbt-native-packager做了同样的事情。冲突阻止了dist建立和打包网络资产罐。所以我删除了我的插件并将设置迁移到Play构建工具内置的等效支持。