java - 在 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 官方文档在这个主题上并不理想。
我的理解是,它归结为:
- 一个使用 JAX-RS 注释的 Web 资源文件,用于将入站调用映射到本地函数
- CXF 运行时(一些注册服务,管理从接收调用到返回序列化信息的生命周期)
- 服务器(Java Servlet 或其有效的抽象,为给定端口生成线程)cxf-rt-transports-http-jetty 的用途
这一切如何在 OSGI 中一起发挥作用?我还应该提到我最熟悉 Gradle,Maven pom.xml 文件可能包含我不认识的东西。
我不喜欢使用 OSGI 和 Karaf 对 CXF Web 服务的公认答案,因为它特定于Blueprint,我不想使用它,因为它依赖于 XML。我在这里寻找解释 CXF 和 OSGI 之间关系的技术答案(如OSGI HTTP Service)。
有关的:
解决方案
首先,简要回顾一下 OSGi:
- OSGi 是一个需要实现的规范
- Felix/Equinox 是 karaf 中的两个实现(请参阅您的 etc/config.properties,使用属性 karaf.framework 来检查您使用的那个,您可以更改它!)
- Karaf 是一个管理工具,它将在您创建的每个命令后面使用 Felix/Equinox。通常,这些命令被代理到由 OSGi 定义到 Felix/Equinox 实现的相应行为。
因此,无论您的上下文如何,您与蓝图链接的解决方案仍然适用。但是,如果您不喜欢蓝图,您可以检查声明式服务,其中您将在“spring/blueprint”世界中定义的每个“bean”都将变为 @Service/@Reference(更纯粹的 OSGi 原始思维方式)或者使用OSGI CDI 集成,如果您习惯于在包中使用更经典的 @Named/@Inject 思维方式,这将更加直观。
但最终,它的原理完全相同:您希望运行的服务器将自己注册到 CXF 总线(通常您不应该在捆绑包中声明,您可以使用默认的)并且您的服务在服务器中注册自己.
推荐阅读
- azure-active-directory - 如果用户帐户在 azure 中被禁用,有没有办法在 UI 上显示自定义消息?
- c - crypt 在使用多线程时返回具有相同输入和盐的不同哈希
- qt - QML - 带有默认参数的信号
- reactjs - 在 React.js (TypeScript) 中设置状态存在问题
- kernel - 添加“文件”实用程序后出现内核崩溃,导致 rootfs.cpio 庞大
- swift - 当视图在 TabView 内时,为什么会调用两次`.onAppear`
- php - 使用 laravel eloquent 创建的服务器上的数组到字符串转换错误
- firebase - 客户端和用户使用相同的 Firestore 实时数据库
- spring - Spring:如何避免将构造函数注入与自动装配字段相结合
- excel - 在 Excel (VB) 中查找值