Metro + Jetty + OSGi =痛苦

时间:2009-12-09 19:10:49

标签: jetty osgi jax-ws java-metro-framework equinox

我正在尝试将Sun的HTTPServer替换为在Equinox上运行的OSGi包中更好的Jetty服务器。

我试过这个:

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

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

但是,正确的jar都在bundle中,而且在Activator中我可以实例化一个org.mortbay.jetty.j2se6.JettyHttpServerProvider。

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

oanyone能否解决这个问题的方法?

P.S。也许可怕的System.setProperty调用有一天会从世界消失。希望:))

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

问题是工厂不是OSGi意识到的,加载工厂的类没有引用Jetty实现。不是它在你的包中(你似乎已经在一个包中组合),而是工厂方法在一些核心代码中,并且无法解决Jetty。

实例化HttpServer的调用不是Java6 API的一部分,而是Sun的内部类之一 - 因此在非Sun JVM上运行时,此调用将失败。最好找出如何使用Metro除了使用这个工厂方法之外的其他事情,以便将这个类放在一起。