在scalatra中找到“没有生命周期类!”

我试图用sbt运行scalatra使用容器:启动命令,但我得到“断言失败:找不到生命周期类!”消息,这是我用“最后一个容器:开始”得到的完整堆栈跟踪:

Blockquote最后一个容器:重启java.lang.AssertionError:断言失败:找不到生命周期类! at org.scalatra.servlet.ScalatraListener.probeForCycleClass(ScalatraListener.scala:50)的scala.Predef $ .assert(Predef.scala:179)org.scalatra.servlet.ScalatraListener.configureCycleClass(ScalatraListener.scala:64)at org org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler)上的org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:800)中的.scalatra.servlet.ScalatraListener.contextInitialized(ScalatraListener.scala:23) .java:446)org.eclipse中的org.eclipse.jetty.server.hand.ConartHandler.startContext(ContextHandler.java:772)org.eclipse中的org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:296) . jetg.webapp.WebAppContext.startWebapp(WebAppContext.java:1359)位于org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1352)org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler . java:744)at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext .java:497)atg.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:125)org . eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:107)位于org.eclipse.jetty.server.handler的org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:60) . 位于org.eclipse.jetty.uart.start(AbstractLifeCycle.java:68)的org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:)中的ContextHandlerCollection.doStart(ContextHandlerCollection.java:154): 125)在org.eclipse.jetty.server.Server.start(Server.java:358)在org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:107)在org.eclipse.jetty.server .handler.AbstractHandler.doStart(AbstractHandler.java:60)在org.eclipse.jetty.server.Server.doStart(Server.java:325)在org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68)com.earldouglas.xsbtwebplugin.Jetty9Runner.start(Jetty9Runner.scala:122)at com.earldouglas.xsbtwebplugin.Container $$ anonfun $ containerSettings $ 11.apply(Container.scala:77)at com . earldouglas.xsbtwebplugin.Container $$ anonfun $ containerSettings $ 11.apply(Container.scala:74)at scala.Function8 $$ anonfun $ tupled $ 1.apply(Function8.scala:35)at scala.Function8 $$ anonfun $ tupled $ 1 . apply(Function8.scala:34)at scala.Function1 $$ anonfun $ compose $ 1.apply(Function1.scala:47)at sbt . $ tilde $ greater $$ anonfun $$ u2219 $ 1.apply(TypeFunctions.scala:42) at sbt.std.Transform $$ anon $ 4.work(System.scala:64)at sbt.Execute $$ anonfun $ submit $ 1 $$ anonfun $ apply $ 1.apply(Execute.scala:237)at sbt.Execute $$ anonfun $提交$ 1 $$ anonfun $在sbt.Execute执行$ 1.apply(Execute.scala:237)sbt.ErrorHandling $ .wideConvert(ErrorHandling.scala:18)sbt.Execute.work(Execute.scala:244)sbt.Execute $$ anonfun $提交$ 1.apply(Execute.scala:237)在sbt.Execute $$ anonfun $ submit $ 1.apply(Execute.scala:237)at sbt.ConcurrentRestric蒸发散$$匿名$ $$ 4 $ anonfun 1.适用(ConcurrentRestrictions.scala:160)在sbt.CompletionService $$匿名$ 2.call(CompletionService.scala:30)在java.util.concurrent.FutureTask.run(FutureTask.java: 262)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask.run(FutureTask.java:262)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor)的.java:1145)在java.util.concurrent.ThreadPoolExecutor中$ Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:744)[误差(容器:重启)的java.lang .AssertionError:断言失败:找不到生命周期类!大段引用

这是我的LifeCycle文件:“ScalatraBootstrap.scala”,它的内容是:

import org.Server.Controllers.Controller2
import org.scalatra.example.Server._
import org.scalatra.LifeCycle
import javax.servlet.ServletContext

class ScalatraBootstrap extends LifeCycle {
  implicit val swagger = new FlowSwagger
  override

  def init(context: ServletContext) {
    context.mount(new Controller1, "/*") context.mount(new Controller2, "/string1/*") context.mount(new Controller3, "/string2/*")
  }
}

回答(4)

2 years ago

ScalatraBootstrap.scala 应该在顶级包中,没有任何 package 名称 .

删除 ScalatraBootstrap.scala 文件中的所有包装内容 .

2 years ago

您可以将bootstrap类放在top,无名包中,或者像这样设置相关的context参数:

context.setInitParameter(ScalatraListener.LifeCycleKey,
  "my.package.MyScalatraBootstrap")

2 years ago

在scalatra中,您需要一个扩展 LifeCycle 的类 . 这是文档中的一个示例

请注意在src / main / scala目录中还有一个名为Scalatra.scala的文件 . 这是Scalatra引导程序配置文件,您应该在其中执行大部分应用程序配置工作 . 使用giter8模板创建新项目时生成的此文件的最简单版本如下所示:

import org.scalatra.LifeCycle
import javax.servlet.ServletContext
import org.yourdomain.projectname._

class ScalatraBootstrap extends LifeCycle {

  override def init(context: ServletContext) {

    // mount servlets like this:
    context mount (new ArticlesServlet, "/articles/*")
  }
}

2 years ago

老问题,但因为我刚刚得到同样的问题 No lifecycle class found 以及之前的回复并没有做出什么:

我案子的解决方案很简单 . 我把 ScalatraBootstrap.scala 放到 src/main ,IntelliJ没有给出任何错误 . 正确的路径是 src/main/scala . 这也显示在Scalatra project structure页面中,但格式化可能会导致将其放在错误的位置 . src/main/scala/ScalatraBootstrap.scala 完美无缺 .