我使用的是" org.eclipse.jetty.server.Server"在XML文件中使用各种参数初始化它(请注意这是一个OSGi环境)。但是我的bundle正在使用类" 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服务器捆绑包已启动并运行,并且我已确保我已经在" Imported-Packages"中提供了正确的版本。我的清单文件的一部分。请帮忙。
答案 0 :(得分:0)
如果你想以
的方式使用Jetty我建议您使用jetty-osgi-boot捆绑包。您可以在documentation of Jetty中找到有关其用法的更多信息。
如果您想开发基于jetty-xml的自定义解决方案,您应该检查jetty-boot的工作方式。
一些提示:
在从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作为参数。