获取ClassNotFoundException:org.eclipse.jetty.server.Server

时间:2015-02-26 09:08:13

标签: jetty osgi jetty-8

我使用的是" org.eclipse.jetty.server.Server"在XML文件中使用各种参数初始化它(请注意这是一个OSGi环境)。但是我的bundle正在使用类" org.eclipse.jetty.server.Server"没有开始并抛出以下异常:

java.lang.ClassNotFoundException: org.eclipse.jetty.server.Server
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:92)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:349)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:327)

我确保Jetty服务器捆绑包已启动并运行,并且我已确保我已经在" Imported-Packages"中提供了正确的版本。我的清单文件的一部分。请帮忙。

1 个答案:

答案 0 :(得分:0)

如果你想以

的方式使用Jetty
  • 基于XML配置初始化Jetty
  • 在OSGi环境中使用

我建议您使用jetty-osgi-boot捆绑包。您可以在documentation of Jetty中找到有关其用法的更多信息。

如果您想开发基于jetty-xml的自定义解决方案,您应该检查jetty-boot的工作方式。

一些提示:

  • ServerInstanceWrapper.configure()函数末尾的XML文件中读取配置。
  • DefaultJettyAtJettyHomeHelper.startJettyAtJettyHome(...)
  • 调用
  • 在从XML配置服务器之前,您会发现线程上下文类加载器被覆盖的技巧。

    ClassLoader contextCl = Thread.currentThread().getContextClassLoader();
    try
    {
        Thread.currentThread().setContextClassLoader(JettyBootstrapActivator.class.getClassLoader());
    
        ...
    
        Server server = ServerInstanceWrapper.configure(null, configURLs, properties);
    
        ...
    
        return server;
    }
    ...
    finally
    {
        Thread.currentThread().setContextClassLoader(contextCl);
    }
    

请注意,链接和示例来自Jetty 9.2.9,因为代码稍微好一些,但您可以在Jetty版本的jetty-osgi-boot中找到相同或类似的逻辑。

使用Thread Context ClassLoader并不是一件好事,但有时候,当调用使用TCL的代码时,这是必要的。最好的情况是Jetty的XMLConfiguration类接受ClassLoader作为参数。