正在获取ClassNotFoundException:org.eclipse.jety.server.server



我正在使用XML文件中的类"org.eclipse.jjetty.server.server",用各种参数初始化它(请注意,这是一个OSGi环境)。然而,我使用类"org.eclipse.jjetty.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服务器捆绑包已经启动并运行,而且我还确保在清单文件的"导入的包"部分提供了正确的版本。请帮忙。

如果您想以的方式使用Jetty

  • Jetty基于XML配置进行初始化
  • 它在OSGi环境中使用

我建议您应该使用jetty osgi引导包。您可以在Jetty的文档中找到有关其用法的更多信息。

如果你想开发一个基于jetty xml的自定义解决方案,你应该检查jetty引导是如何做到的

一些提示:

  • 配置是在ServerInstanceWrapper.config()函数的末尾从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引导中找到相同或相似的逻辑。

使用线程上下文类加载器不是一件好事,但当调用使用TCL的代码时,有时这是必要的。最好是Jetty的XMLConfiguration类接受ClassLoader作为参数。

相关内容

  • 没有找到相关文章

最新更新