无法 运行 使用 scalatra scala 开发的网络应用程序
unable to run web-app developed using 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 在内部使用 jetty 到 运行 应用程序,我在项目中设置了 webapp 目录 (src/main/webapp/),我可以在本地使用 intellij 运行 应用程序但是当我从 jar 文件(使用 sbt 程序集创建)中 运行 它时,它找不到 Web 应用程序文件夹。下面是主应用程序的代码。
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 方法设置 war 位置。
- 在上下文
中设置之前获取 src/main/webapp 的绝对路径
提前致谢!
如果您的程序集 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
以通过 sbt-assembly-plugin 将 webapp/*
包含到您的程序集 jar 文件中:
unmanagedResourceDirectories in Compile += { baseDirectory.value / "src/main/webapp" }
我第一次使用 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 在内部使用 jetty 到 运行 应用程序,我在项目中设置了 webapp 目录 (src/main/webapp/),我可以在本地使用 intellij 运行 应用程序但是当我从 jar 文件(使用 sbt 程序集创建)中 运行 它时,它找不到 Web 应用程序文件夹。下面是主应用程序的代码。
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 方法设置 war 位置。 - 在上下文
中设置之前获取 src/main/webapp 的绝对路径提前致谢!
如果您的程序集 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
以通过 sbt-assembly-plugin 将 webapp/*
包含到您的程序集 jar 文件中:
unmanagedResourceDirectories in Compile += { baseDirectory.value / "src/main/webapp" }