Я тестирую с помощью веб-фреймворка Scala (Udash) и пытаюсь запустить игрушечный пример в Heroku. У меня он работает без проблем на местном уровне, следуя инструкциям в документации Heroku:
sbt compile stage
heroku local web
Однако после развертывания любой URL, который я набираю, переходит на 404, даже на целевую страницу приложения. Это объекты, которые я использую:
object Launcher extends CrossLogging {
def main(args: Array[String]): Unit = {
val port = Properties.envOrElse("PORT", "5000").toInt
val server = new ApplicationServer(port, "frontend/target/UdashStatics/WebContent")
server.start()
logger.info(s"Application started...")
}
}
class ApplicationServer(val port: Int, resourceBase: String) {
private val server = new Server(port)
private val contextHandler = new ServletContextHandler
private val appHolder = createAppHolder()
contextHandler.setSessionHandler(new SessionHandler)
contextHandler.setGzipHandler(new GzipHandler)
contextHandler.getSessionHandler.addEventListener(new org.atmosphere.cpr.SessionSupport())
contextHandler.addServlet(appHolder, "/*")
server.setHandler(contextHandler)
def start(): Unit = server.start()
def stop(): Unit = server.stop()
private def createAppHolder() = {
val appHolder = new ServletHolder(new DefaultServlet)
appHolder.setAsyncSupported(true)
appHolder.setInitParameter("resourceBase", resourceBase)
appHolder
}
}
Есть ли какие-либо конфигурации / характеристики Heroku, которые мне не хватает?
EDIT
Пытался применить предложенные изменения и в итоге получил следующий ApplicationContext:
class ApplicationServer(val port: Int, val resourceBase: String) {
val server = new Server()
val connector = new ServerConnector(server)
connector.setPort(port)
server.addConnector(connector)
private val appHolder = createAppHolder()
val context = new ServletContextHandler(ServletContextHandler.SESSIONS)
context.setBaseResource(Resource.newResource(resourceBase))
context.setContextPath("/")
context.addServlet(appHolder, "/")
server.setHandler(context)
private def createAppHolder() = {
val appHolder = new ServletHolder("default", classOf[DefaultServlet])
appHolder.setInitParameter("dirAllowed", "true")
appHolder.setInitParameter("resourceBase", resourceBase)
appHolder
}
def start(): Unit = server.start()
def stop(): Unit = server.stop()
}
Однако после развертывания на Heroku я все еще получаю сообщение об ошибке 404 даже на целевой странице:
HTTP ERROR 404
Problem accessing /. Reason:
Not Found
При запуске приложения на локальном компьютере я правильно попадаю на целевую страницу.
Спасибо!
Спасибо!