【问题标题】:Configuring Lift with xsbt-web-plugin: finding the main method class使用 xsbt-web-plugin 配置 Lift:找到主要方法类
【发布时间】:2016-06-17 19:15:55
【问题描述】:

我正在尝试“从头开始”创建 Lift Web 应用程序,但遇到了一些困难。我从xsbt-web-plugin version 2.1 开始,并设法让它与一个简单的Jetty servlet 一起工作。然后我尝试整合来自Lift Cookbook的信息。

这是我的build.sbt

organization := "ford.nathaniel"

name := "Lift From Scratch"

version := "0.1-SNAPSHOT"

scalaVersion := "2.11.7"

libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided"

enablePlugins(JettyPlugin)

libraryDependencies ++= {
  val liftVersion = "3.0-M8"
  Seq(
    "net.liftweb" %% "lift-webkit" % liftVersion % "compile",
    "org.eclipse.jetty" %  "jetty-webapp" % "9.2.1.v20140609" % "container, test",
    "org.eclipse.jetty" %  "jetty-plus"   % "9.2.1.v20140609" % "container, compile"
  )
}

我有一个(一行)project/plugins.sbt

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "2.1.0")

我直接从上面链接的 Cookbook 中提取了 Boot.scala 文件并将其放在 src/main/scala/bootstrap 和类似的 src/main/webapp/WEB-INF/web.xml 中。我可以从命令行运行sbt,它加载干净,但是当我尝试container:start...

> container:start
[info] starting server ...
[success] Total time: 0 s, completed Mar 3, 2016 9:52:25 PM
Error: Could not find or load main class 
> 

我不清楚sbt 是如何找到Lift 的主类的。我查看了很多旧版本的sbt 配置,它们有所不同,因为早期版本使用的是早期版本的 xsbt 插件。 (具体来说,你会看到像 seq(webSettings :_*) 这样的东西——这还能做什么?)我提取了最新版本的 jetty-webappjetty-plus,所以我认为这不是问题所在。另一方面,这些配置都没有说明 Lift 如何确定 Boot.scala 的位置,反过来我不确定如何编写配置以使其知道如何引导框架。

两个来源之间的一个主要区别是新的 Jetty README 配置了 servlet like this

libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided"

enablePlugins(JettyPlugin)

containerLibs in Jetty := Seq("org.eclipse.jetty" % "jetty-runner" % "9.2.1.v20140609" intransitive())

containerMain in Jetty := "org.eclipse.jetty.runner.Runner"

这似乎在Jetty插件上配置了SettingKey,并指向Jetty runner以启动servlet。但是,鉴于我不是通过标准 servlet 运行,而是通过配置为指向 web.xml 中的 Lift 应用程序的过滤器,这似乎是我应该删除的东西。

显然我误解了一些东西。我如何诊断为什么 xsbt-web-plugin 没有使用 Lift 框架?似乎要么我找不到按惯例配置,要么我需要对 Jetty 做一些特别的事情来指向web.xml 过滤器。任何人都可以帮助澄清如何诊断这一点,或阐明这两个库应该如何协同工作?

【问题讨论】:

  • 如果我没记错的话,Jetty 是在寻找jetty-web.xml 而不是web.xml,除非你通过代码重新配置它?已经有一段时间了。
  • 我认为这个旧项目可以在 Jetty 上运行,就像您需要的那样:github.com/izmailoff/lift_authentication_starter。在此处检查 xml 文件:github.com/dahdahm/lift_authentication_starter/tree/master/src/…。我不确定它是否还能编译,但你可能会找到你需要的东西。
  • @AlekseyIzmailov 我已经确认如果使用简单的 servlet,它可以与 web.xml 一起使用,但不适用于 Lift。你有链接re:jetty.xml吗? xsbt-web-plugin 的文档中提到了它,但作为一个“附加组件”,所以似乎没有具体的理由走这条路。
  • @AlekseyIzmailov 引用的存储库位于 Jetty 8(不是 9.2.1)和 Lift 2(而不是 3)上。特别是 webSettings 位似乎在后来的插件版本中消失了。

标签: scala sbt lift


【解决方案1】:

以下build.sbt 在以jetty:start(而不是container:start)执行时最终为我工作。看来net.liftweb 需要作为libraryDependency 而不是containerLibs 包含在内,并且Jetty 插件管理容器。但是,我特别不明白有什么区别或将来如何诊断(最终只是尝试了很多不同的事情)。

但值得注意的是,如果 web.xml 文件设置为使用 Lift 过滤器,则会自动拾取 Boot.scala 类 Lift。

organization := "ford.nathaniel"

name := "Lift From Scratch"

version := "0.1-SNAPSHOT"

scalaVersion := "2.11.7"

libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided"

//logLevel := Level.Debug

enablePlugins(JettyPlugin)

libraryDependencies ++= {
  val liftVersion = "3.0-M8"
  Seq(
    "net.liftweb" %% "lift-webkit" % liftVersion % "compile"
  )
}

containerLibs in Jetty := {
  val liftVersion = "3.0-M8"
  Seq(
    "org.eclipse.jetty" % "jetty-webapp" % "9.2.1.v20140609",
    "org.eclipse.jetty" % "jetty-plus"   % "9.2.1.v20140609",
    "org.eclipse.jetty" % "jetty-runner" % "9.2.1.v20140609" intransitive()
  )
}

containerMain in Jetty := "org.eclipse.jetty.runner.Runner"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    相关资源
    最近更新 更多