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

获取ClassNotFoundException:org.eclipse.jetty.server.server,jetty,osgi,jetty-8,Jetty,Osgi,Jetty 8,我在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)

我在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)

我已经确保jetty服务器包已经启动并运行,并且我已经确保在清单文件的“导入的包”部分提供了正确的版本。如果您想以这种方式使用Jetty,请提供帮助。

  • Jetty是基于XML配置初始化的
  • 它在OSGi环境中使用
我建议您使用bundle。您可以在中找到有关其用法的更多信息

如果您想开发基于jetty xml的定制解决方案,您应该检查jetty boot是如何实现的

一些提示:

  • 在函数结束时,从XML文件读取配置
  • 那是从
  • 在这里,您将发现一个技巧,即在从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作为参数。

是的,我使用的是基于Jetty.xml的自定义解决方案。我尝试了jetty osgi引导使用的相同方法(将contextclassloader更改为指向activator的classloader),但没有成功。不确定我是否遗漏了什么。将contextclassloader更改为指向activator的classloader“:我猜您已更改为Activator的类加载器,即捆绑包的类加载器。该类加载器是否看到org.eclipse.jetty.server.server类?我的意思是,包是否导入org.eclipse.jetty.server包?如果您检查org.eclipse.jetty.util.Loader.loadClass(Loader.java:92)的源代码,您将看到使用了上下文类加载器。所以要么你在设置类加载器时出错,要么你传递的类加载器没有看到那个类。我终于让它工作了。非常感谢你的帮助。你太棒了:)