启用注释时找不到 Jetty 9.3.9.v20160517 Provider WebSocketCdiInitializer
Jetty 9.3.9.v20160517 Provider WebSocketCdiInitializer not found when enabling Annotations
使用 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.access0(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.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
在 class 路径中
这个 issue 建议停用 cdi
Jetty 模块,但它没有说明如何使用嵌入式 Jetty。
我该如何解决这个问题?
编辑
我们意识到这个问题可能是由应用程序 运行 所在的(复杂)环境引起的。
因此,我特别有兴趣了解什么可能导致抛出此异常的根本原因
结论
TD;LR: Jetty-9.3.9 嵌入式!= Jetty-9.3.9 独立
对于 Jetty 9.2.14,我们以编程方式启动 Jetty(就像嵌入 Jetty 一样),但使用的是独立 Jetty 的未打包版本的 jars。
自 Jetty 7(或什至 6)以来,我们的设置工作正常,但升级到 Jetty 9.3.9 后开始出现问题。
注意:我们正在使用 Jersey、servlet 和极少数 JSP。没有网络套接字。我们正在升级以测试 HTTP/2.
来自 Jetty 9.3.2 的源代码 [1] (我想这些行在来到 9.3.9 之后没有改变) 我找到了以下源代码片段:
851 //Get initial set of SCIs that aren't from excluded jars or excluded by the containerExclusionPattern, or excluded
852 //because containerInitializerOrdering omits it
853 for (ServletContainerInitializer sci:loadedInitializers)
854 {
855 if (matchesExclusionPattern(sci))
856 {
857 if (LOG.isDebugEnabled()) LOG.debug("{} excluded by pattern", sci);
858 continue;
859 }
860
861 Resource sciResource = getJarFor(sci);
862 if (isFromExcludedJar(context, sci, sciResource))
863 {
864 if (LOG.isDebugEnabled()) LOG.debug("{} is from excluded jar", sci);
865 continue;
866 }
评论说这里检查了SCI(ServletContainerInitializer)是否没有被排除在外。您的堆栈跟踪告诉我们第 864 行抛出异常。 LOG.debug 试图说明原因是 SCI 来自排除的 jar 从而导致您遇到的错误。
我的建议是你检查你的maven配置(你的pom.xml)关于包含org.eclipse.jetty.annotations.AnnotationConfiguration文件的包:
<!-- http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-annotations -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-annotations</artifactId>
<version>9.3.9.M1</version>
</dependency>
[2] 并且这种依赖性不排除某些奇怪的原因。我想 jar 指的是 Maven 依赖项。
我的来源:
[2]
http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-annotations/9.3.9.M1
既然你说的是jetty-embedded,解决方法就简单了。
不要在您的项目中包含 jetty-cdi-*
jar。
它们不适用于嵌入式码头。
直接从焊接项目中为 Jetty Embedded 使用 cdi-weld
工件。
请务必阅读有关如何设置 WebAppClassloader
以允许 weld 查看服务器组件的 weld 文档。 (这叫做"punching a hole in the webapp isolation layer")
使用 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.access0(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.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
在 class 路径中
这个 issue 建议停用 cdi
Jetty 模块,但它没有说明如何使用嵌入式 Jetty。
我该如何解决这个问题?
编辑
我们意识到这个问题可能是由应用程序 运行 所在的(复杂)环境引起的。
因此,我特别有兴趣了解什么可能导致抛出此异常的根本原因
结论
TD;LR: Jetty-9.3.9 嵌入式!= Jetty-9.3.9 独立
对于 Jetty 9.2.14,我们以编程方式启动 Jetty(就像嵌入 Jetty 一样),但使用的是独立 Jetty 的未打包版本的 jars。
自 Jetty 7(或什至 6)以来,我们的设置工作正常,但升级到 Jetty 9.3.9 后开始出现问题。
注意:我们正在使用 Jersey、servlet 和极少数 JSP。没有网络套接字。我们正在升级以测试 HTTP/2.
来自 Jetty 9.3.2 的源代码 [1] (我想这些行在来到 9.3.9 之后没有改变) 我找到了以下源代码片段:
851 //Get initial set of SCIs that aren't from excluded jars or excluded by the containerExclusionPattern, or excluded
852 //because containerInitializerOrdering omits it
853 for (ServletContainerInitializer sci:loadedInitializers)
854 {
855 if (matchesExclusionPattern(sci))
856 {
857 if (LOG.isDebugEnabled()) LOG.debug("{} excluded by pattern", sci);
858 continue;
859 }
860
861 Resource sciResource = getJarFor(sci);
862 if (isFromExcludedJar(context, sci, sciResource))
863 {
864 if (LOG.isDebugEnabled()) LOG.debug("{} is from excluded jar", sci);
865 continue;
866 }
评论说这里检查了SCI(ServletContainerInitializer)是否没有被排除在外。您的堆栈跟踪告诉我们第 864 行抛出异常。 LOG.debug 试图说明原因是 SCI 来自排除的 jar 从而导致您遇到的错误。
我的建议是你检查你的maven配置(你的pom.xml)关于包含org.eclipse.jetty.annotations.AnnotationConfiguration文件的包:
<!-- http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-annotations -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-annotations</artifactId>
<version>9.3.9.M1</version>
</dependency>
[2] 并且这种依赖性不排除某些奇怪的原因。我想 jar 指的是 Maven 依赖项。
我的来源:
[2] http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-annotations/9.3.9.M1
既然你说的是jetty-embedded,解决方法就简单了。
不要在您的项目中包含 jetty-cdi-*
jar。
它们不适用于嵌入式码头。
直接从焊接项目中为 Jetty Embedded 使用 cdi-weld
工件。
请务必阅读有关如何设置 WebAppClassloader
以允许 weld 查看服务器组件的 weld 文档。 (这叫做"punching a hole in the webapp isolation layer")