2

在我的 build.sbt 我有:

resourceDirectory in Compile <<= baseDirectory(_ / "src/main/webapp")

这是我的 JettyLauncher.main:

  def main(args: Array[String]) {
    val port = if(System.getenv("PORT") != null) System.getenv("PORT").toInt else 8080

    println(s"JettyLauncher: ${port}")
    val server = new Server(port)
    val context = new WebAppContext()
    context setContextPath "/"
    context.setResourceBase("src/main/webapp")
    context.addServlet(classOf[MyServlet], "/*")

    server.setHandler(context)

    server.start
    server.join
  }

notFound我的方法中:

notFound {
  // remove content type in case it was set through an action
  contentType = null
  serveStaticResource() getOrElse <h1>Not found. Bummer.</h1>
}

Web 服务是可访问的,并且可以按我的预期工作,但是当我启动我的应用程序时,找不到静态内容(在本例中为 index.html)

java -jar myapp.jar

我觉得我需要编写自己的serveStaticResource函数,但我希望不会。

这就是我所看到的,HTTP 200 是由于找不到文件的“糟糕”响应:

09:13:44.735 [qtp874703452-16 - /index.html] DEBUG org.eclipse.jetty.server.Server - REQUEST /index.html on AsyncHttpConnection@fb4871b,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=14,c=0},r=3
09:13:44.748 [qtp874703452-17] DEBUG org.eclipse.jetty.http.HttpParser - filled 0/0
09:13:44.752 [qtp874703452-16 - /index.html] DEBUG o.e.j.server.handler.ContextHandler - scope null||/index.html @ o.e.j.w.WebAppContext{/,file:/C:/Users/src/main/webapp}
09:13:44.759 [qtp874703452-16 - /index.html] DEBUG o.e.j.server.handler.ContextHandler - context=||/index.html @ o.e.j.w.WebAppContext{/,file:/C:/Users/src/main/webapp}
09:13:44.764 [qtp874703452-16 - /index.html] DEBUG org.eclipse.jetty.server.session - sessionManager=org.eclipse.jetty.server.session.HashSessionManager@5f8b459a
09:13:44.768 [qtp874703452-16 - /index.html] DEBUG org.eclipse.jetty.server.session - session=null
09:13:44.771 [qtp874703452-16 - /index.html] DEBUG o.e.jetty.servlet.ServletHandler - servlet ||/index.html -> gov.ornl.cyber.botmon.ui.BotMonServlet-1
09:13:44.774 [qtp874703452-16 - /index.html] DEBUG o.e.jetty.servlet.ServletHandler - chain=null
09:13:44.813 [qtp874703452-16 - /index.html] DEBUG org.eclipse.jetty.server.Server - RESPONSE /index.html  200 handled=true

如何配置 Jetty Launcher 以便正确找到静态文件?

有没有办法告诉它 src/main/webapp 是一个资源文件夹?

我遇到的另一个问题是,在notFound函数中我看不到如何知道未找到哪个文件,因此我可以this.context.getResource("src/main/webapp" + missingfile)从使用 Scalatra 调用自己。我认为这是我的困难的根源是我现在没有找到哪个文件。

4

1 回答 1

1

您在那里设置资源基础的行非常好:

  context.setResourceBase("src/main/webapp")

notFound方法也很好,如果你把它放在资源库下,Scalatra 会选择一个 index.html 文件:

notFound {
  contentType = null // although probably you would want to set this to 'text/html'
  serveStaticResource() getOrElse <h1>Not found. Bummer.</h1>
}

为了有一个可执行的 jar(不是从 sbt 运行),你需要从一个文件夹中执行 jar,在这个文件夹中你仍然有src/main/webapp文件夹及其与执行相关的所有内容。

注意:request.getRequestURL 会给你请求 URL,但我不建议重写 serveStaticResource,因为它做得很好

 notFound {
    println("Oh yeah: " + request.getRequestURL)
}

注意 2:看看https://github.com/softwaremill/bootzooka他们很好地分离了 REST 服务和 UI 层(使用 html+angularJS)。

于 2013-11-12T20:23:26.523 回答