使用akka-http重新加载静态资源

时间:2016-07-22 10:45:57

标签: scala akka akka-http hotswap

简而言之:是否可以使用akka-http重新加载静态资源?

再多一点:

  • 我有Scala项目。
  • 我正在使用App对象启动我的Main 类。
  • 我正在使用getFromResourceDirectory来查找我的资源 文件夹中。

我希望在开发过程中热插拔我的静态资源。 例如,我有index.htmlapplication.js,我更改了这些内容,并且在刷新浏览器而不重新启动服务器后,我希望看到更改。做这种事的最佳做法是什么?

我知道Play!允许这样做,但不希望仅仅因此而将我的项目基于Play!

3 个答案:

答案 0 :(得分:4)

两个选项:

  1. 最简单:在本地运行时使用getFromDirectory指令,并将其指向您希望“加载”文件的路径。是的,它直接从文件系统为它们提供服务,因此每次更改文件并通过Akka HTTP加载它都将是最新版本。
  2. getFromResourceDirectory从类路径加载文件,资源可用,因为SBT会在每次构建(target)时将它们复制到copyResources下的类目录中。您可以使用unmanagedClasspath配置sbt,使其包含类路径中的静态资源目录。如果你想在运行package时打包工件中的资源,但是这需要更多的sbt-trixery(如果你只是将src/resources放在unmanagedClasspath中它将依赖于类路径排序,如果使用复制的或修改过的。)

答案 1 :(得分:2)

我无法通过添加到unmanagedClasspath使它正常工作,所以我改用getFromDirectory。如果getFromResourceDirectory这样失败,则可以使用getFromDirectory作为后备。

val route =
  pathSingleSlash {
    getFromResource("static/index.html") ~
    getFromFile("../website/static/index.html")
  } ~
  getFromResourceDirectory("static") ~
  getFromDirectory("../website/static")

首先,它尝试在静态资源目录中查找文件,如果失败,则检查../website/static是否具有该文件。

答案 2 :(得分:1)

以下代码尝试在目录" staticContentDir "中找到该文件。如果找到该文件,则将其发送回客户端。如果找不到,则尝试从目录" 站点"中提取文件。在类路径中。 用户网址为:http://server:port/site/path/to/file.ext

/ site /来自" staticPath"

  val staticContentDir = calculateStaticPath()
  val staticPath = "site"
  val routes = pathPrefix(staticPath) {
    entity(as[HttpRequest]) { requestData =>
      val fullPath = requestData.uri.path
      encodeResponse {
        if (Files.exists(staticContentDir.resolve(fullPath.toString().replaceFirst(s"/$staticPath/", "")))) {
          getFromBrowseableDirectory(staticContentDir.toString)
        } else {
          getFromResourceDirectory("site")
        }
      }
    }
  }

我希望很清楚。