【问题标题】:OSGi Bundle in Felix - ClassNotFoundException for Jetty class loaded by nameFelix 中的 OSGi Bundle - 按名称加载的 Jetty 类的 ClassNotFoundException
【发布时间】:2015-04-07 14:26:43
【问题描述】:

pom.xml:

<Import-Package>
         org.eclipse.jetty.websocket.server,*
</Import-Package>

清单.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 控制台:

导入包 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");

请帮我弄清楚我在这里做错了什么?

【问题讨论】:

  • 问题是,你从哪里得到“加载器”。

标签: osgi apache-felix jetty-9


【解决方案1】:

我遇到了同样的问题,并在 Felix 邮件列表中询问。正如 Balazs 所指出的,它与“加载器”部分有关。 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);

查看示例以获得更完整的代码。

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2011-05-05
    • 2014-09-30
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多