我正在使用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作为参数。