0

我在 XML 文件中使用类“org.eclipse.jetty.server.Server”用各种参数初始化它(请注意这是一个 OSGi 环境)。但是,我使用“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)

我已确保码头服务器捆绑包已启动并正在运行,并且我已确保在清单文件的“导入包”部分中提供了正确的版本。请帮忙。

4

1 回答 1

0

如果你想以这样的方式使用 Jetty

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

我建议你应该使用jetty-osgi-boot包。您可以在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 作为参数。

于 2015-02-26T20:48:38.440 回答