【发布时间】:2016-06-06 13:37:38
【问题描述】:
使用 DeploymentManager 部署 webapp 时,会抛出此错误
2016-06-06 15:19:37,750 WARN [org.eclipse.jetty.deploy.DeploymentManager] (WrapperSimpleAppMain) Unable to reach node goal: started (DeploymentManager.java:506)
java.util.ServiceConfigurationError: javax.servlet.ServletContainerInitializer: Provider org.eclipse.jetty.cdi.websocket.WebSocketCdiInitializer not found
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:372)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.eclipse.jetty.annotations.AnnotationConfiguration.getNonExcludedInitializers(AnnotationConfiguration.java:864)
at org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:444)
at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:494)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1361)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772)
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:520)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
在启用注释支持时会发生这种情况:
org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration"
);
classlist.addAfter(
"org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration"
);
jar cdi-websocket-9.3.9.v20160517.jar 在类路径中
这个issue 建议停用cdi Jetty 模块,但没有说明如何使用嵌入式Jetty。
我该如何解决这个问题?
编辑
我们意识到这个问题可能是由应用程序运行的(复杂)环境引起的。
因此,我特别有兴趣了解什么可能导致引发此异常的根本原因
结论
TD;LR:Jetty-9.3.9 嵌入式!= Jetty-9.3.9 独立
在 Jetty 9.2.14 中,我们以编程方式启动 Jetty(就像嵌入的 Jetty),但使用的是独立 Jetty 的未打包版本的 jar。
自 Jetty 7(甚至可能是 6)以来,我们的设置运行良好,但升级到 Jetty 9.3.9 时,情况开始出现问题。
注意:我们使用的是 Jersey、servlet 和极少数的 JSP。没有网络套接字。我们正在升级以测试 HTTP/2。
【问题讨论】:
-
其实更好的说法是
jetty-cdi-*是专门为独立的jetty-distribution及其模块系统设计的。当您在embedded-jetty中时,使用它过于复杂(而且毫无意义)。更简单的解决方案是直接使用cdi-weld。