Felix 中的 OSGi Bundle - Jetty class 的 ClassNotFoundException 按名称加载
OSGi Bundle in Felix - ClassNotFoundException for Jetty class loaded by name
pom.xml:
<Import-Package>
org.eclipse.jetty.websocket.server,*
</Import-Package>
MANIFEST.MF:
Import-Package: org.eclipse.jetty.websocket.server;version="[9.2,10)"
日志中的异常:
javax.servlet.ServletException: java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory
Felix Web 控制台:
Imported Packages org.eclipse.jetty.websocket.server,version=9.2.6 from
org.apache.felix.http.jetty (39)
org.eclipse.jetty.websocket.servlet.WebSocketServletFactory中的相关代码:
Class<WebSocketServletFactory> wssf = (Class<WebSocketServletFactory>)loader
.loadClass("org.eclipse.jetty.websocket.server.WebSocketServerFactory");
请帮我找出我做错了什么?
我 运行 遇到了同样的问题,并在 Felix 邮件列表上询问过。正如 Balazs 所指出的,它与 "loader" 部分有关。
http://www.mail-archive.com/users%40felix.apache.org/msg16222.html 的线程包含一些使用 ContextClassLoader 的示例的 URL。
感谢 Paul,基本上你需要这样的东西:
// Cache the current classloader
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
// Find the classloader used by the bundle providing jetty
ClassLoader classLoader = jettyBundle.getClassLoader();
// Set the classloader
Thread.currentThread().setContextClassLoader(classLoader);
// Register the servlet
httpService.registerServlet("/servletName", new MyWebSocketServlet(), null, null);
// Restore the classloader
Thread.currentThread().setContextClassLoader(ccl);
查看示例以获得更完整的代码。
pom.xml:
<Import-Package>
org.eclipse.jetty.websocket.server,*
</Import-Package>
MANIFEST.MF:
Import-Package: org.eclipse.jetty.websocket.server;version="[9.2,10)"
日志中的异常:
javax.servlet.ServletException: java.lang.ClassNotFoundException: org.eclipse.jetty.websocket.server.WebSocketServerFactory
Felix Web 控制台:
Imported Packages org.eclipse.jetty.websocket.server,version=9.2.6 from org.apache.felix.http.jetty (39)
org.eclipse.jetty.websocket.servlet.WebSocketServletFactory中的相关代码:
Class<WebSocketServletFactory> wssf = (Class<WebSocketServletFactory>)loader
.loadClass("org.eclipse.jetty.websocket.server.WebSocketServerFactory");
请帮我找出我做错了什么?
我 运行 遇到了同样的问题,并在 Felix 邮件列表上询问过。正如 Balazs 所指出的,它与 "loader" 部分有关。 http://www.mail-archive.com/users%40felix.apache.org/msg16222.html 的线程包含一些使用 ContextClassLoader 的示例的 URL。
感谢 Paul,基本上你需要这样的东西:
// Cache the current classloader
ClassLoader ccl = Thread.currentThread().getContextClassLoader();
// Find the classloader used by the bundle providing jetty
ClassLoader classLoader = jettyBundle.getClassLoader();
// Set the classloader
Thread.currentThread().setContextClassLoader(classLoader);
// Register the servlet
httpService.registerServlet("/servletName", new MyWebSocketServlet(), null, null);
// Restore the classloader
Thread.currentThread().setContextClassLoader(ccl);
查看示例以获得更完整的代码。