How can one change the location of the “webapp” directory for a Scalatra application?

僤鯓⒐⒋嵵緔 提交于 2019-12-05 08:49:51
Eugene Yokota

@Kelsey Gilmore-Innis has the right answer, but since it's not accepted let's break it, break it, break it down.

First, I'm assuming you're following Getting started guide to install Scalatra using g8. Hopefully the same version I just got.

g8 scalatra/scalatra-sbt

What that g8 template did was to set up an sbt 0.13 build which uses scalatra-sbt 0.3.2 plugin:

addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.2")

This plugin internally uses JamesEarlDouglas/xsbt-web-plugin 0.4.0 to do the webapp-related settings.

xsbt-web-plugin 0.4.0

This is why xsbt-web-plugin becomes relevant even though you just want to change Scalatra's setting. The setting you need to rewire is called webappResources in Compile. How does that work?

rewiring webappResources

To rewire the setting, open project/build.scala. Add

import com.earldouglas.xsbtwebplugin.PluginKeys.webappResources

to the import clauses. Then change settings as follows:

  lazy val project = Project (
    "foo",
    file("."),
    settings = Defaults.defaultSettings ++ ScalatraPlugin.scalatraWithJRebel ++ scalateSettings ++ Seq(
      organization := Organization,
      name := Name,
      version := Version,
      scalaVersion := ScalaVersion,
      resolvers += Classpaths.typesafeReleases,
      webappResources in Compile := Seq(baseDirectory.value / "content" / "doc-root"),
      ...
    )
  )

Now move src/main/webapp to content/doc-root, reload sbt, and that should be it.

The resource folder is a Jetty property. If you're running embedded Jetty, it's specified here. You can edit it manually or override by setting the PUBLIC environment variable.

You also can override it in your SBT build file. It uses the xsbt-web-plugin to run, and you can override that plugin's settings.

For newer version of xsbt-web-plugin (1.0.0 as of writing) the way of changing source path is different.

First of all corresponding settings were moved to XwpPlugin.webappSettings. And you needs these two

webappSrc in webapp <<= (baseDirectory in Compile) map { _ / "content" / "doc-root" },
webappDest in webapp <<= (baseDirectory in Compile) map { _ / "content" / "doc-root" },

If you dont want to change the sbt settings, you can also do it programmatically by overriding serveStaticResource and using forward

override protected def serveStaticResource(): Option[Any] = {
  // check to see if we need to alter the path to find the TRUE disk url
  val incUrl = request.getRequestURI

  if(incUrl.startsWith("/otherDir")) {
    servletContext.resource(request) map { _ =>
      servletContext.getNamedDispatcher("default").forward(request, response)
    }
  } else {
     val trueUrl = "/otherdir" + incUrl
     Option(servletContext.getRequestDispatcher(trueUrl).forward(request, response))
  }
}

Disclaimer: You should also check that it doesn't go into an infinite loop.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!