在Java 11上使用Jetty Maven插件9.4.32.v20200930为类`FutureCallback`和`LazyList`获取`NoClassDefFoundError`

问题描述

几个月前,我开始使用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.sourcemaven.compiler.target在POM中都设置为 11 ,如果我在POM中放置提供org.eclipse.jetty.util.FutureCallbackorg.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都没有找到解决方法或解决方法。

如果您找到解决方案,请对上述问题发表评论(或提交新的问题),我们会记录在案。