Scalatra загружает статический контент из исполняемого файла jar

В моем 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>
}

Веб-сервисы доступны и работают так, как я ожидаю, но статический контент (в данном случае 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. Я думаю, что корень моей трудности в том, что я не знаю, какой файл не был найден.


person James Black    schedule 25.10.2013    source источник
comment
file:/C:/Users/jb9/src/main/webapp это действительно?   -  person Balint Pato    schedule 13.11.2013
comment
@BalintPato - Нет, на самом деле это неверно, поскольку в каталоге не было ничего, кроме файла jar.   -  person James Black    schedule 13.11.2013


Ответы (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 и слой пользовательского интерфейса (с html + angularJS) довольно хорошо.

person Balint Pato    schedule 12.11.2013
comment
Спасибо, я попробую это завтра. - person James Black; 13.11.2013