鉴于 fuse 源的 apache-servicemix-4.4.1-fuse-00-08 中的“cxf-osgi”示例,使用 maven 3.0.3 构建,将其部署到 apache karaf 2.2.4 和 CXF 2.4.3 时,Web 服务是从未发布过,对 CXF servlet (http://localhost:8181/cxf/) 永远不可见。karaf 日志中没有错误。如何调试这种行为?
3 回答
值得调高日志级别 - 您可以etc/org.ops4j.pax.logging.cfg
在控制台或控制台中永久执行此操作log:set TRACE org.apache.cxf
- IIRC 这将显示一些有用的信息。
还要检查它是否实际发布在 localhost/127.0.0.1 上 - 它很可能发布在另一个接口上,即本地网络的 IP 但不是 localhost。尝试使用 0.0.0.0 作为地址,这样它将绑定到所有可用的接口。
当您使用 maven 时,您可以下载 CXF 源代码(在 Eclipse 中很容易)并将远程调试器连接到 Karaf 实例,通过一些策略性放置的断点,您应该能够掌握正在发生的事情。
尝试更改为 Equinox 而不是默认的 Felix。2.4.3 中有一个错误,它不能很好地与 Felix 一起使用。或者,现在可以使用 CXF 2.4.4 来修复它。
看看我本周提交的这个问题:https ://issues.apache.org/jira/browse/CXF-4058
我发现如果我的 beans.xml 在 cxf bundle jar 之前加载,那么端点会注册到 CXF 而不是 OSGi http 服务。所以从日志看一切都很好,但端点永远无法访问。这是一个竞争条件。
我做了两个解决方法:1)在短期内,只需在启动顺序的后面移动我自己的 jar(我使用 Karaf 功能),以便在读取 beans.xml 之前完全加载 Spring 和 CXF;2)放弃 Spring 并滚动我的自己的绑定代码松散地基于这种方法:http ://eclipsesource.com/blogs/2012/01/23/an-osgi-jax-rs-connector-part-1-publishing-rest-services/
我昨天刚刚实施了解决方案#2,我已经非常满意了。它解决了我所有的类加载器问题(在我不得不手动添加大量 Import-Package 行之前,因为 BND 没有看到 beans.xml 引用)并修复了我的启动竞争条件。