невозможно запустить веб-приложение, разработанное с использованием scalatra scala

Я впервые разработал веб-приложение с использованием scalatra 2.6.3 и scala 2.11.8, и оно не запускается с использованием jar. Ниже приведены мои зависимости в build.sbt

scalaVersion := "2.11.8"
val scalatraVersion = "2.6.3"

dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-core" % "2.9.4"
dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.4"
dependencyOverrides += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.4"


libraryDependencies ++= Seq(
  "com.microsoft.sqlserver" % "mssql-jdbc" % "6.4.0.jre8", //Microsoft JDBC Driver For SQL Server
  "com.typesafe.play" %% "play-json" % "2.5.10",
  "com.typesafe" % "config" % "1.2.1", //Configuration
  "org.scalaj" %% "scalaj-http" % "2.3.0" % "compile",
  "org.apache.spark" %% "spark-core" % "2.2.0",
  "org.apache.spark" %% "spark-sql" % "2.2.0",
  "org.scala-lang" % "scala-library" % "${scala.version}",
  "org.apache.lucene" % "lucene-queryparser" % "7.2.1",
  "org.apache.lucene" % "lucene-queries" % "7.2.1",
  "org.apache.lucene" % "lucene-analyzers-common" % "7.2.1",
  "org.apache.lucene" % "lucene-codecs" % "7.2.1" ,
  "com.microsoft.azure" % "azure-storage" % "3.1.0",
  "com.microsoft.azure" % "azure-eventhubs" % "0.6.6",
  "org.apache.hadoop" % "hadoop-azure" % "2.7.0",
  "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3-1",
  "com.amazonaws" % "aws-java-sdk-logs" % "1.10.40",

  //Logging
  "org.slf4j" % "slf4j-api" % "1.7.25",
  "ch.qos.logback" % "logback-classic" % "1.2.3",

  "org.scalatra" %% "scalatra" % scalatraVersion,
  "org.scalatra" %% "scalatra-scalatest" % scalatraVersion % "test",
  "org.eclipse.jetty" % "jetty-webapp" % "9.4.10.RC1",
  "javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided",
  "org.scalatra" %% "scalatra-scalate" % scalatraVersion
)

unmanagedResourceDirectories in Compile += { baseDirectory.value / "src/main/webapp" }
enablePlugins(ScalatraPlugin)

assemblyMergeStrategy in assembly := {

  case PathList("META-INF", xs @ _*) =>
    (xs map {_.toLowerCase}) match {
       case "services" :: xs =>
        MergeStrategy.first
      case _ => MergeStrategy.discard
    }
   case x => MergeStrategy.first
}

Я знаю, что для запуска приложения scalatra внутренне использует причал, у меня есть каталог webapp (src / main / webapp /) в проекте, и я могу запускать приложение локально, используя intellij, но когда я запускаю его из файла jar (созданного с использованием сборки sbt) тогда не удается найти папку веб-приложения. Ниже приведен код основного приложения.

val server = {
  val listenPort = if (System.getenv.containsKey("PORT")) System.getenv.get("PORT").toShort else ConfigFactory.load.getString("api.port_num").toShort;
  logger.info("Listen Port: " + listenPort)
  new Server(listenPort)
}

val context: WebAppContext = new WebAppContext();
val webappDirLocation = "src/main/webapp/"
context.setServer(server)
context.setContextPath("/");
context.setDescriptor(webappDirLocation + "/WEB-INF/web.xml")
context.setResourceBase(webappDirLocation)
server.setHandler(context);

try {
  server.start()
  server.join()
} catch {
  case e: Exception => logger.error(s"Error occurred while starting App : $e")
    throw new RuntimeException(s"Unable to start App : $e")
}

Пожалуйста, предложите, как решить эту ошибку, я полностью застрял на этом. Пытался выполнить следующие шаги, чтобы решить эту проблему, но не повезло: -установить место войны с помощью метода context.setWar. -получение абсолютного пути к src / main / webapp перед настройкой в ​​контексте

Заранее спасибо!


person Monika    schedule 04.05.2018    source источник
comment
Можете ли вы показать, как вы это запускаете и какую ошибку вы получаете?   -  person mfirry    schedule 04.05.2018
comment
Я запускаю его с помощью scala -classpath InputSuggester-assembly-1.0.jar com.affinio.app.StartJetty, где StartJetty - это основной файл, содержащий код, опубликованный выше. Не выдает мне никаких ошибок, но класс сервлета не выполняется (не получайте журналы для класса сервлета, который появляется, когда я запускаю в intellij, также не может отправить запрос сервлету; приводит к HTTP ERROR 404), просто получите 18/05 / 04 13:18:46 Сервер ИНФОРМАЦИИ: запущен @ 3519 мс   -  person Monika    schedule 04.05.2018
comment
так что это не было построено с использованием обычного предложенного ScalatraBootstrap?   -  person mfirry    schedule 05.05.2018


Ответы (1)


Если файл jar сборки содержит /WEB-INF/web.xml, вы можете настроить WebAppContext следующим образом:

val context: WebAppContext = new WebAppContext()
val webXml = getClass.getResource("/WEB-INF/web.xml")

val webappDirLocation = if(webXml != null){
  // running the assembly jar
  webXml.toString.replaceFirst("/WEB-INF/web.xml$", "/")
} else {
  // running on the source tree
  "src/main/webapp/"
}

context.setResourceBase(webappDirLocation)
context.setDescriptor(webappDirLocation + "WEB-INF/web.xml")

В приведенном выше примере конфигурация переключается, потому что для работы в дереве исходных текстов и для запуска сборки jar требуется другая конфигурация.

Кроме того, обратите внимание, что вам нужно добавить следующую строку в ваш build.sbt, чтобы включить webapp/* в файл jar сборки с помощью sbt-assembly-plugin:

unmanagedResourceDirectories in Compile += { baseDirectory.value / "src/main/webapp" }
person Naoki Takezoe    schedule 06.05.2018
comment
Но теперь я получаю ошибку вроде: java.lang.NoSuchMethodError: scala.Predef $ .refArrayOps ([Ljava / lang / Object;) Lscala / collection / mutable / ArrayOps; в org.fusesource.scalate.util.ClassPathBuilder $ .getClassPathFrom (ClassPathBuilder.scala: 143) по адресу org.fusesource.scalate.util.ClassPathBuilder.addPathFrom (ClassPathBuilder.scala: 70) в org.fusesource.scala. addPathFrom (ClassPathBuilder.scala: 65) в org.fusesource.scalate.servlet.ServletTemplateEngine.buildClassPath (ServletTemplateEngine.scala: 117) ... - person Monika; 07.05.2018
comment
Попробуйте заменить зависимость scalatra-scalate_2.11 на org.scalatra %% scalatra-scalate% ScalatraVersion и удалить org.scalatra.scalate% scalate-core_2.11% 1.8.0. - person Naoki Takezoe; 08.05.2018
comment
Вы удалили или заменили все зависимости _2.11 в своем проекте? Думаю, ваш проект работает со Scala 2.12, но некоторые библиотеки ссылаются на Scala 2.11. Этот вопрос может вам помочь: stackoverflow.com/ questions / 40328948 / - person Naoki Takezoe; 09.05.2018
comment
Спасибо Наоки за ваш ответ. Обновлена ​​зависимость в вопросе. Я использую scala 2.11.8 - person Monika; 09.05.2018