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