我正在使用 jetty的pushbuilder 来推送一些资源。由于这些资源是从webapp内部指定的,所以我不能使用jetty的默认pushCacheFilter。
当我从我的主java-class启动jetty嵌入时,它运行良好,我可以使用https连接到我的页面,并且推送工作正常。
但是,当我通过jetty:run-forked启动时,它会启动并提供此输出:
**Started ServerConnector@45b4c3a9{SSL,[http/1.1, ssl, alpn, h2]}{0.0.0.0:8443}**
然后在访问该页面时出现此错误:
**java.lang.ClassNotFoundException: org.eclipse.jetty.server.Request
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:586)**
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.basex.http2.HTTP2Settings.push(HTTP2Settings.java:60)
at org.basex.http.HTTPConnection.initResponse(HTTPConnection.java:127)
at org.basex.http.restxq.RestXqResponse.serialize(RestXqResponse.java:209)
at org.basex.http.restxq.RestXqResponse.serialize(RestXqResponse.java:195)
at org.basex.http.restxq.RestXqResponse.create(RestXqResponse.java:97)
at org.basex.http.restxq.RestXqModule.process(RestXqModule.java:104)
at org.basex.http.restxq.RestXqFunction.process(RestXqFunction.java:109)
at org.basex.http.restxq.RestXqServlet.run(RestXqServlet.java:49)
at org.basex.http.BaseXServlet.service(BaseXServlet.java:59)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:833)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:206)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:564)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:289)
at org.eclipse.jetty.io.ssl.SslConnection$3.succeeded(SslConnection.java:149)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:591)
at java.lang.Thread.run(Thread.java:748)
也许是的......与maven类加载?
修改
发生了另一个错误:在maven-build之后,我的一些最新代码更改似乎丢失了。我试图只运行“maven clean”,但仍然缺少字段并抛出异常。
在启动jetty嵌入时也会找到这些字段。
很多!
答案 0 :(得分:0)
再次阅读码头文件后,我找到了原因:
如果jetty是servlet-container,则对webapp隐藏服务器类。所以这是我的错,必须抛出异常! (请参阅此处的文档:http://www.eclipse.org/jetty/documentation/9.4.x/jetty-classloading.html)
我认为其他遗漏字段例外与此“禁止”导入相关。
所以我认为我的问题是另一个问题:
当不确定我的webapp是否在jetty中部署时,怎么能实现(特定于码头的)serverPush?
Jetty自己的解决方案(pushCacheFilter.java)不符合我的需求。 所以我想我必须检查,如果我能编写一个在jetty发送响应的那一刻起作用的过滤器。