我正在尝试使用没有播放框架的sbt-web插件,而是使用xsbt-web-plugin构建一个webapp。
我已经让sbt-web插件在处理资产管道时正常工作,并让它创建一个有效的webjar输出(通过packageBin)以及标准的“web / public / main”输出(通过资产)。
另外,我一直在使用xsbt-web-plugin来开发一个webapp并从SBT中提供该webapp(通过container:start)。 webapp项目可以使用来自mavenCentral的webjar依赖项,并且可以毫无问题地引用这些资源。
我无法弄清楚的是如何让xsbt-web-plugin包含来自Web应用程序中sbt-web管道的资产。似乎我能做的最好的事情就是让他们进入CLASSPATH。 (根据我的理解,这就是游戏所需要的,因为它们有一个“资产控制器”,可以从CLASSPATH中提供这些资产,因此不需要它们作为Web应用程序的静态资产提供)。 p>
我创建了一个公共GitHub存储库(https://github.com/MartinSnyder/serving-sbt-web-output)来演示我想要做的事情。
我的plugins.sbt是:
resolvers += Resolver.typesafeRepo("releases")
addSbtPlugin("com.typesafe.sbt" % "sbt-web" % "1.1.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6")
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "1.0.0")
我的build.sbt是:
name := "Example project serving sbt-web output from within SBT"
organization in ThisBuild := "com.martinsnyder"
version in ThisBuild := "0.0.1"
scalaVersion in ThisBuild := "2.11.6"
lazy val example_webjar =
project
.in(file("example_webjar"))
.settings(libraryDependencies ++= Seq("org.webjars" % "requirejs" % "2.1.16"))
.enablePlugins(SbtWeb)
lazy val example_webapp =
project
.in(file("example_webapp"))
.dependsOn(example_webjar)
.settings(libraryDependencies ++= Seq(
"javax.servlet" % "servlet-api" % "2.5" % "provided",
"org.eclipse.jetty" % "jetty-webapp" % "9.3.0.M2" % "container",
"org.eclipse.jetty" % "jetty-plus" % "9.3.0.M2" % "container",
"commons-logging" % "commons-logging" % "1.2" % "container"
))
.enablePlugins(SbtWeb)
.settings(jetty(): _*)
webapp中的HTML文件是:
<html>
<head>
<title>Example</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<link rel="stylesheet" type="text/css" href="lib/example_webjar/css/main.css">
<link rel="stylesheet" type="text/css" href="webjar/example_webjar/0.0.1/css/main.css">
<script src="webjars/requirejs/2.1.16/require.js"></script>
</head>
<body>
<div class="red">Red</div>
<div class="green">Green</div>
</body>
</html>
目前的情况是,requirejs已成功提供,因为它来自预构建的webjar。这三个标签都是不同的,并且未能尝试从sbt-web引用资产输出。
我想要实现的最好的情况是获取xsbt-web-plugin webapp输出中包含的sbt-web插件输出(target / web / public / main / )(target / webapp / )。我愿意接受xsbt-web-plugin作为webjar访问项目依赖项。
答案 0 :(得分:2)
如果您tell xsbt-web-plugin使用sbt-web的输出作为其Web应用程序资源目录,它应该可以帮到您。
只需将webappSrc in webapp <<= WebKeys.assets in Assets
添加为example_webapp
项目的设置:
lazy val example_webapp =
project
.in(file("example_webapp"))
.dependsOn(example_webjar)
.settings(libraryDependencies ++= Seq(
"javax.servlet" % "servlet-api" % "2.5" % "provided",
"org.eclipse.jetty" % "jetty-webapp" % "9.3.0.M2" % "container",
"org.eclipse.jetty" % "jetty-plus" % "9.3.0.M2" % "container",
"commons-logging" % "commons-logging" % "1.2" % "container"
))
.enablePlugins(SbtWeb)
.settings(jetty(): _*)
.settings(webappSrc in webapp <<= WebKeys.assets in Assets)
答案 1 :(得分:1)
在解决issue之前,以下配置可能有用:
// To sbt-web: Use 'src/main/webapp' for asset sources
sourceDirectory in Assets := baseDirectory.value / "src" / "main" / "webapp"
// To xsbt-web-plugin: Use sbt-web output instead of 'src/main/webapp'
webappSrc in webapp <<= WebKeys.assets in Assets
这样,您就可以对资产和普通配置文件(例如src/main/webapp
)使用web.xml
。
答案 2 :(得分:0)
另一种替代方法是按照https://github.com/earldouglas/xsbt-web-plugin/issues/228中的建议使用webappPostProcess
。这将允许您保留现有的项目结构。
以下示例将sbt-web产生的所有内容复制到您的战争的“资产”目录中(并覆盖目标目录中的所有重复文件):
webappPostProcess := {
import Path._
val assets = (Compile / WebKeys.assets).value
webapp =>
val tocopy = (assets ** ("*" -- HiddenFileFilter)).get()
val pairs = tocopy pair rebase(assets, webapp / "assets")
IO.copy(pairs, true, true, false)
}