首次开发的Scalatra 2.6.3+Scala 2.11.8 Web应用无法通过Jar运行
解决Scalatra 2.6.3 + Scala 2.11.8可执行Jar运行问题
嘿,我来帮你搞定这个Scalatra可执行Jar跑不起来的问题!结合你给出的build.sbt片段,大概率是打包时没包含依赖或者缺少启动类配置——这是Scalatra新手打包最容易踩的两个坑,我给你一步步调整:
1. 先加sbt-assembly插件(核心!)
默认的sbt package只会打包你自己的代码,不会把依赖包塞进去,所以得用sbt-assembly打包含所有依赖的「胖Jar」。
在项目根目录的project/plugins.sbt文件里添加:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10") // 这个版本完美适配Scala 2.11和sbt 0.13.x
2. 完善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" // 补充必要的Scalatra依赖(尤其是内嵌Jetty的包) libraryDependencies ++= Seq( "org.scalatra" %% "scalatra" % scalatraVersion, "org.scalatra" %% "scalatra-jetty" % scalatraVersion, // 内嵌Jetty服务器,必须加! "org.scalatra" %% "scalatra-scalatest" % scalatraVersion % Test, "ch.qos.logback" % "logback-classic" % "1.2.3" % Runtime, "javax.servlet" % "javax.servlet-api" % "3.1.0" % Provided ) // 指定可执行Jar的主类(替换成你自己的启动类全路径) mainClass in assembly := Some("com.example.MyScalatraServer") // 处理打包时的文件冲突(比如重复的META-INF文件) assemblyMergeStrategy in assembly := { case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard case PathList("META-INF", xs@_*) => MergeStrategy.discard case x => MergeStrategy.first }
3. 写一个启动类(如果还没有的话)
Scalatra需要一个内嵌服务器的启动入口,比如写一个Jetty启动类:
package com.example import org.scalatra.servlet.ScalatraListener import org.eclipse.jetty.server.Server import org.eclipse.jetty.servlet.{ServletContextHandler, ServletHolder} // 你的Scalatra路由类(替换成你自己的) class MyScalatraServlet extends ScalatraServlet { get("/") { <h1>Hello, Scalatra!</h1> } } // 服务器启动类 class MyScalatraServer { def start(): Unit = { val server = new Server(8080) // 监听8080端口 val context = new ServletContextHandler(ServletContextHandler.SESSIONS) context.setContextPath("/") context.addEventListener(new ScalatraListener) context.addServlet(new ServletHolder(new MyScalatraServlet), "/*") server.setHandler(context) server.start() server.join() } } // 主入口,继承App让它成为可执行类 object MyScalatraServer extends App { new MyScalatraServer().start() }
4. 打包并运行
在终端执行打包命令:
sbt assembly
打包完成后,会在target/scala-2.11目录下生成一个类似your-project-name-assembly-0.1.jar的胖Jar,然后运行:
java -jar target/scala-2.11/your-project-name-assembly-0.1.jar
之后访问http://localhost:8080就能看到你的应用了!
额外排查点
如果还是跑不起来,检查这两个地方:
- 确认启动类是
object且继承了App,或者有明确的main方法 - 看看控制台报错是不是有依赖冲突,你加的jackson版本override是对的,大概率能解决版本不一致问题
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

