我正在尝试使用没有播放框架的 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 将来自 sbt-web 管道的资产包含在 Web 应用程序中。看来我能做的最好的就是让它们进入 CLASSPATH。(据我了解,这就是游戏所需要的全部,因为他们有一个“资产控制器”,可以从 CLASSPATH 中为这些资产提供服务,因此不需要将它们作为静态资产提供给 Web 应用程序)。
我已经创建了一个公共 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 的资产输出的尝试失败。
我试图实现的最佳情况是让 sbt-web 插件输出(target/web/public/main/ )包含在 xsbt-web-plugin webapp 输出(target/webapp/)中。我会满足于 xsbt-web-plugin 能够以 webjar 的形式访问项目依赖项。