Felix中的OSGi包-按名称加载的Jetty类的ClassNotFoundException

Felix中的OSGi包-按名称加载的Jetty类的ClassNotFoundException,osgi,apache-felix,jetty-9,Osgi,Apache Felix,Jetty 9,pom.xml: <Import-Package> org.eclipse.jetty.websocket.server,* </Import-Package> 日志中的异常: javax.servlet.ServletException:java.lang.ClassNotFoundException:org.eclipse.jetty.websocket.server.WebSocketServerFactory Felix网络控制台: 从导入的包

pom.xml:

<Import-Package>
         org.eclipse.jetty.websocket.server,*
</Import-Package>
日志中的异常:

javax.servlet.ServletException:java.lang.ClassNotFoundException:org.eclipse.jetty.websocket.server.WebSocketServerFactory

Felix网络控制台:

从导入的包org.eclipse.jetty.websocket.server,版本=9.2.6 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");
Class wssf=(Class)加载器
.loadClass(“org.eclipse.jetty.websocket.server.WebSocketServerFactory”);

请帮我找出我做错了什么?

我遇到了同样的问题,并在Felix邮件列表中询问。正如Balazs所指出的,它与“装载机”部分有关。 位于的线程包含指向使用ContextClassLoader的某些示例的URL

多亏了保罗,基本上你需要这样的东西:

// 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);

有关更完整的代码,请参见示例。

问题是,“加载程序”从何处获得。
// 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);