0

我试图在 Equinox 上运行的 OSGi 包中将 Sun 的 HTTPServer 换成更好的 Jetty 服务器。

我试过这个:

System.setProperty("com.sun.net.httpserver.HttpServerProvider","org.mortbay.jetty.j2se6.JettyHttpServerProvider");

但是当调用 endpoint.publish(url) 并生成服务器时,它会抱怨 org.mortbay.jetty.j2se6.JettyHttpServerProvider 的 ClassNotFoundException。

但是,正确的 jar 在包中,实际上在 Activator 中我可以实例化 org.mortbay.jetty.j2se6.JettyHttpServerProvider。

我认为这是某种类路径问题 - 生成的服务器可能位于不同的类路径中?我尝试在 JDK 级别添加 JAR,但这没有任何区别。

任何人都可以阐明如何使这项工作正常进行吗?

PS 也许有一天,可怕的 System.setProperty 调用将从世界上消失。希望 :)

4

3 回答 3

0

我似乎无法回复 omerkudat,所以我不得不把回复放在这里......

如果您包含 osgi jar,Metro 似乎不使用 Jetty。你似乎需要这个:

http://docs.codehaus.org/display/JETTY/J2se6HttpServerSPI

我手动编译,并如上所述设置系统属性,不成功。

于 2009-12-10T16:17:58.510 回答
0

问题是工厂不支持 OSGi,加载工厂的类没有引用 Jetty 实现。这不是它是否在您的捆绑包中(您似乎已将其组合在一个捆绑包中),而是工厂方法在某些核心代码中,并且无法解析 Jetty。

实例化 HttpServer 的调用不是 Java6 API 的一部分,而是 Sun 的内部类之一 - 因此在非 Sun JVM 上运行时,此调用将失败。最好了解如何使用 Metro 来做一些事情,而不是使用这个工厂方法来将类聚集在一起。

于 2009-12-10T22:19:52.817 回答
0

Equinox 实现了由 Jetty 6.x 支持的 OSGi 标准 HttpService。只需包含正确的捆绑包,您就可以轻松地在 Equinox 中运行 Jetty。但是,我发现 a) Jetty 对你完全隐藏,你看到的只是 HttpService 接口,b) HttpService 接口相当简单。只能添加 servlet+mappings 和一些静态资源

于 2009-12-10T09:25:18.043 回答