首页 > 解决方案 > 在 Felix 中启动和运行 CXF (JAX-RS) Web 资源的最低要求是什么?

问题描述

我想在 OSGI 中启动并运行实现 JAX-RS 的 CXF(特别是运行 Apache Felix 的 Apache Karaf)。

这个项目:cxf-osgi-activator为例,我看到工程师做出了设计决定,将jetty Karaf 功能jax-rs Karaf 功能分开。两者在运行时是否存在依赖关系?jax-rs 功能是否使用了一些技巧(例如来自环境:OSGI HTTP 服务)来让自己监听入站连接,还是仍然需要这样做?也许我的问题可以通过RestDeployer.java文件第 250 行的解释来回答。它究竟从哪里拉出它的服务器?它总是得到一个,还是依赖于码头 Karaf 功能

我看了一下测试,它们似乎使用 iPojo 或声明式服务(我很难区分!)来减少样板代码,但以理解为代价(因为它需要更深入的知识这个主题比我现在看起来的要好。)

CXF 官方文档在这个主题上并不理想。

我的理解是,它归结为:

这一切如何在 OSGI 中一起发挥作用?我还应该提到我最熟悉 Gradle,Maven pom.xml 文件可能包含我不认识的东西。

我不喜欢使用 OSGI 和 Karaf 对 CXF Web 服务的公认答案,因为它特定于Blueprint,我不想使用它,因为它依赖于 XML。我在这里寻找解释 CXF 和 OSGI 之间关系的技术答案(如OSGI HTTP Service)。

有关的:

标签: javaosgicxfapache-karafapache-felix

解决方案


首先,简要回顾一下 OSGi:

  1. OSGi 是一个需要实现的规范
  2. Felix/Equinox 是 karaf 中的两个实现(请参阅您的 etc/config.properties,使用属性 karaf.framework 来检查您使用的那个,您可以更改它!)
  3. Karaf 是一个管理工具,它将在您创建的每个命令后面使用 Felix/Equinox。通常,这些命令被代理到由 OSGi 定义到 Felix/Equinox 实现的相应行为。

因此,无论您的上下文如何,您与蓝图链接的解决方案仍然适用。但是,如果您不喜欢蓝图,您可以检查声明式服务,其中您将在“spring/blueprint”世界中定义的每个“bean”都将变为 @Service/@Reference(更纯粹的 OSGi 原始思维方式)或者使用OSGI CDI 集成,如果您习惯于在包中使用更经典的 @Named/@Inject 思维方式,这将更加直观。

但最终,它的原理完全相同:您希望运行的服务器将自己注册到 CXF 总线(通常您不应该在捆绑包中声明,您可以使用默认的)并且您的服务在服务器中注册自己.


推荐阅读