问题描述
几个月前,我开始使用Jetty Maven插件维护一个旧的Spring项目。我目前正在尝试将其移植到Java 11,但是Jetty无法启动服务器,并且(无声地)以MultiException[java.lang.NoClassDefFoundError: org/eclipse/jetty/util/FutureCallback,java.lang.NoClassDefFoundError: org/eclipse/jetty/util/LazyList]
失败。
这似乎是Jetty Maven插件的一个旧错误,我可以在各种9.x
版本上进行复制。
在版本10和版本11中似乎已修复,我很乐意使用这些版本,但它们都仍处于Alpha状态,配置已发生根本变化,并且文档尚未发布。
maven.compiler.source
和maven.compiler.target
在POM中都设置为 11 ,如果我在POM中放置提供org.eclipse.jetty.util.FutureCallback
和org.eclipse.jetty.util.LazyList
的依赖项,则没有任何变化
[WARNING] Failed ServletHandler@4ba402b5{Failed}: java.lang.NoClassDefFoundError: org/eclipse/jetty/util/LazyList
java.lang.NoClassDefFoundError: org/eclipse/jetty/util/LazyList
at org.eclipse.jetty.servlet.ServletHandler.doStop (ServletHandler.java:277)
at org.eclipse.jetty.util.component.AbstractLifeCycle.stop (AbstractLifeCycle.java:93)
at org.eclipse.jetty.util.component.ContainerLifeCycle.stop (ContainerLifeCycle.java:180)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop (ContainerLifeCycle.java:201)
at org.eclipse.jetty.server.handler.AbstractHandler.doStop (AbstractHandler.java:108)
at org.eclipse.jetty.security.SecurityHandler.doStop (SecurityHandler.java:437)
at org.eclipse.jetty.security.ConstraintSecurityHandler.doStop (ConstraintSecurityHandler.java:425)
at org.eclipse.jetty.util.component.AbstractLifeCycle.stop (AbstractLifeCycle.java:93)
at org.eclipse.jetty.util.component.ContainerLifeCycle.stop (ContainerLifeCycle.java:180)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop (ContainerLifeCycle.java:201)
at org.eclipse.jetty.server.handler.AbstractHandler.doStop (AbstractHandler.java:108)
at org.eclipse.jetty.server.session.SessionHandler.doStop (SessionHandler.java:519)
at org.eclipse.jetty.util.component.AbstractLifeCycle.stop (AbstractLifeCycle.java:93)
at org.eclipse.jetty.util.component.ContainerLifeCycle.stop (ContainerLifeCycle.java:180)
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStop (ContainerLifeCycle.java:201)
at org.eclipse.jetty.server.handler.AbstractHandler.doStop (AbstractHandler.java:108)
at org.eclipse.jetty.server.handler.ContextHandler.stopContext (ContextHandler.java:1061)
at org.eclipse.jetty.servlet.ServletContextHandler.stopContext (ServletContextHandler.java:375)
at org.eclipse.jetty.webapp.WebAppContext.stopWebapp (WebAppContext.java:1462)
at org.eclipse.jetty.maven.plugin.JettyWebAppContext.stopWebapp (JettyWebAppContext.java:342)
at org.eclipse.jetty.webapp.WebAppContext.stopContext (WebAppContext.java:1428)
at org.eclipse.jetty.server.handler.ContextHandler.doStop (ContextHandler.java:1115)
at org.eclipse.jetty.servlet.ServletContextHandler.doStop (ServletContextHandler.java:286)
at org.eclipse.jetty.webapp.WebAppContext.doStop (WebAppContext.java:547)
at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStop (JettyWebAppContext.java:433)
解决方法
这是行家与码头之间相互作用的有趣的副作用。
发生的事情是,在码头停止/关闭时,maven进程将类加载器从码头线程的下面拉出,从而在唤醒后留下了随机错误,有些甚至无法找到需要执行干净关闭的类。
请参见https://github.com/eclipse/jetty.project/issues/4410
Jetty或Maven都没有找到解决方法或解决方法。
如果您找到解决方案,请对上述问题发表评论(或提交新的问题),我们会记录在案。