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

Getting ClassNotFoundException: org.eclipse.jetty.server.Server

我正在使用 XML 文件中的 class "org.eclipse.jetty.server.Server" 来使用各种参数对其进行初始化(请注意这是一个 OSGi 环境)。但是我使用 class "org.eclipse.jetty.server.Server" 的包没有启动并抛出以下异常:

java.lang.ClassNotFoundException: org.eclipse.jetty.server.Server
        at java.net.URLClassLoader.run(Unknown Source)
        at java.net.URLClassLoader.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)

我已确保码头服务器包已启动 运行,而且我已确保在清单文件的 "Imported-Packages" 部分提供了正确的版本。请帮忙

如果您想以

的方式使用 Jetty
  • Jetty 是根据XML 配置初始化的
  • 在 OSGi 环境中使用

我建议您使用 jetty-osgi-boot bundle. You can find more information about its usage in the 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 class 接受一个 ClassLoader 作为参数。