目的
Scalatra3.0.0-M2を動かすにあたり、sbt new scalatra/scalatra.g8
したところ、動かない箇所がいくつかあったので忘備録。なおTwirlは要らないのとライブラリがConflictして動かなかったので全部削除している。
なおJettyPluginをContainerPluginに変更するとjetty:start
はcontainer:start
に変わる。
build.sbt
val ScalatraVersion = "3.0.0-M2"
// Scala3系に対応したので最新のScalaにしてみた
ThisBuild / scalaVersion := "3.1.3"
ThisBuild / organization := "com.ponkotuy"
// いつもの。おこのみで
ThisBuild / scalacOptions ++= Seq("-unchecked", "-deprecation")
lazy val hello = (project in file("."))
.settings(
name := "Photographic Indexer",
version := "0.1.0-SNAPSHOT",
libraryDependencies ++= Seq(
"org.scalatra" %% "scalatra" % ScalatraVersion,
"org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test",
"ch.qos.logback" % "logback-classic" % "1.2.3" % "runtime",
// Jettyが11にアップデートしたので対応する
"org.eclipse.jetty" % "jetty-webapp" % "11.0.11" % "container",
// Jetty11はjakartaになったのでこちらもjavax.servletから変更
"jakarta.servlet" % "jakarta.servlet-api" % "5.0.0"
)
)
// TwirlはConflictしていたのと使わないので一旦削除
// JettyPluginはJettyが9.x系なのでpluginを自作する必要がある
enablePlugins(ContainerPlugin)
val jettyRunner = "org.eclipse.jetty" % "jetty-runner" % "11.0.11"
Container / containerLibs := Seq(
jettyRunner.intransitive()
)
Container / containerMain := "org.eclipse.jetty.runner.Runner"
ScalatraBootstrap.scala
import com.ponkotuy.app._
// javaxからjakartaに変わったので変更する
import jakarta.servlet.ServletContext
import org.scalatra._
class ScalatraBootstrap extends LifeCycle {
override def init(context: ServletContext): Unit = {
context.mount(new MyScalatraServlet, "/*")
}
}
CORS
多分CORSまわりがバグってる?ようで、Cross-Originのアクセスに必要なヘッダが付与されないので、自前で設定する必要がある。localhostだけ許可するみたいな要件だと、こんな感じのtraitを作って必要なハンドラに食わせる。
trait CORSSetting { self: ScalatraServlet =>
val Localhost = "\\Ahttp://localhost(:\\d+)?\\z".r
before() {
val origin = Option(request.getHeader("Origin"))
if(origin.exists(Localhost.matches)) {
response.setHeader("Access-Control-Allow-Origin", origin.get)
}
}
}
plugins.sbt
たぶん書き換えしなくても動く
// Twirlは使わないので削除していい
// 4.2.4が最新なので一応
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "4.2.4")