You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

首次开发的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:54:45