Как можно изменить расположение каталога "webapp" для приложения Scalatra?
По умолчанию Scalatra ожидает, что каталог "webapp" будет src/main/webapp
, Как это можно изменить, например, на content/doc-root
?
sbt позволяет настраивать каталоги по умолчанию, используя что-то вроде следующего:
scalaSource <<= (baseDirectory)(_ / "src")
Поэтому я предполагаю, что это просто вопрос правильного использования "ключа конфигурации" для использования...
4 ответа
@Kelsey Gilmore-Innis имеет правильный ответ, но так как он не принят, давайте сломать его, сломать его, сломать его.
Во-первых, я предполагаю, что вы следуете руководству по началу работы по установке Scalatra с помощью g8
, Надеюсь, ту же версию я только что получил.
g8 scalatra / скалатра-сбт
Этот шаблон g8 сделал для создания сборки sbt 0.13, которая использует плагин scalatra-sbt 0.3.2:
addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.2")
Этот плагин внутренне использует https://github.com/JamesEarlDouglas/xsbt-web-plugin 0.4.0 для настройки веб-приложения.
xsbt-web-plugin 0.4.0
Вот почему xsbt-web-plugin становится актуальным, даже если вы просто хотите изменить настройки Scalatra. Настройка, которую нужно переписать, называется webappResources in Compile
, Как это работает?
перемонтирование webappResources
Чтобы изменить настройку, откройте project/build.scala
, добавлять
import com.earldouglas.xsbtwebplugin.PluginKeys.webappResources
к пунктам импорта. Затем измените настройки следующим образом:
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, и это должно быть.
Папка ресурса является свойством Jetty. Если вы используете встроенный Jetty, это указано здесь. Вы можете отредактировать его вручную или переопределить, установив переменную окружения PUBLIC.
Вы также можете переопределить его в своем файле сборки SBT. Он использует xsbt-web-plugin для запуска, и вы можете переопределить настройки этого плагина.
Для более новой версии 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" },
Если вы не хотите изменять настройки sbt, вы также можете сделать это программно, переопределив serveStaticResource и используя 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))
}
}
Отказ от ответственности: Вы также должны убедиться, что он не входит в бесконечный цикл.