如何更改Scalatra应用程序的“webapp”目录的位置?

时间:2013-05-07 02:20:03

标签: scala sbt scalatra scalatra-sbt

默认情况下,Scalatra希望“webapp”目录位于src/main/webapp。如何将其更改为例如content/doc-root

sbt允许使用以下内容自定义其默认目录:

scalaSource <<= (baseDirectory)(_ / "src")

所以我认为只需要知道使用正确的“配置密钥”......

4 个答案:

答案 0 :(得分:4)

资源文件夹是Jetty属性。如果您正在运行嵌入式Jetty,则会指定here。您可以手动编辑它,也可以通过设置PUBLIC环境变量来覆盖它。

您也可以在SBT构建文件中覆盖它。它使用xsbt-web-plugin运行,并使用can override that plugin's settings

答案 1 :(得分:4)

@Kelsey Gilmore-Innis有正确的答案,但由于它不被接受,让我们打破它,打破它,打破它。

首先,我假设您正在关注Getting started guide以使用g8安装Scalatra。希望我得到的版本相同。

g8 scalatra / scalatra-sbt

g8模板的作用是设置一个使用scalatra-sbt 0.3.2插件的sbt 0.13版本:

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

此插件内部使用JamesEarlDouglas/xsbt-web-plugin 0.4.0进行与webapp相关的设置。

xsbt-web-plugin 0.4.0

这就是为什么即使您只想更改Scalatra的设置,xsbt-web-plugin也会变得相关。您需要重新连接的设置称为webappResources in Compile。这有什么作用?

重新布线webappResources

要重新设置该设置,请打开project/build.scala。添加

import com.earldouglas.xsbtwebplugin.PluginKeys.webappResources

到import子句。然后按如下方式更改设置:

  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"),
      ...
    )
  )

现在将src/main/webapp移至content/doc-root,重新加载sbt,应该是它。

答案 2 :(得分:1)

对于较新版本的xsbt-web-plugin(编写时为1.0.0),更改源路径的方式不同。

首先,相应的设置已移至XwpPlugin.webappSettings。你需要这两个

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

答案 3 :(得分:0)

如果您不想更改sbt设置,您也可以通过覆盖serveStaticResource并使用转发

以编程方式执行此操作
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))
  }
}

免责声明:您还应该检查它是否会进入无限循环。