写点什么

OSGi 4.3 引入了 Generics 与 Capabilities

  • 2011-03-31
  • 本文字数:2138 字

    阅读完需:约 7 分钟

在近日举办的 EclipseCon 2011 上,下一版的核心 OSGi 平台发布了最终草案,其文档将于不久之后发布。BJ Hargrave 在演讲中介绍了 OSGi 4.3 的新特性,并且概述了它与旧版之间的差别。

泛型

意料之中的一个特性就是核心 OSGi API 增加了泛型支持。这样就可以通过类型安全的操作查找特定类型的服务了,从而不必进行类型转换。然而,由于 OSGi 需要运行在嵌入式(1.5 之前)VM 上,因此没法使用 1.5 的编译器来构建核心 API。但很多人都会忽略 -target jsr14 这个选项,我们可以使用它编译使用了泛型的 Java 代码并运行在 1.4 兼容的 JRE 上。引入该选项的初衷是向 JSR 14 中的泛型进行迁移,但现在很多编译器都将其保留了下来。这样客户端代码(使用了 -target jsr14 选项在 1.4 下编译,或是在 1.5+ 上编译)就可以引用服务了,如下代码所示:

复制代码
// OSGi 4.2 way
// ServiceReference ref = context.getServiceReference(
// LogService.class.getName());
// LogService log = (LogService)context.getService(ref);
// OSGi 4.3 way
ServiceReference<LogService> ref = context.getServiceReference(
LogService.class);
LogService log = context.getService(ref);

然而,由于核心并非完全兼容于 1.5,因此并没有使用其他特性(诸如枚举和注解)。

Capabilities

在 OSGi 环境中,传统的依赖单元要么是 package 依赖,要么是 bundle 依赖(通过 Import-Package 或是 Require-Bundle)。虽然这些依赖对于代码没什么问题,但他们却没法很好地表达非代码的依赖。比如说,某个 bundle 可能需要一些内存或是 Web 服务器,但这两者都没法通过具体的 package 或是 bundle 来表示。

OSGi 4.3 引入了通用 capability 的概念,它可与 Require-Capability 和 Provide-Capability 搭配使用。在解析 bundle 之前必须得满足必要的 capability 需求。其典型使用场景是用于提供 OSGi 的声明式服务,该服务并不会表示为 package 依赖,但为了能够正确解析 bundle,我们还是需要它的。

此外,所需的最小版本号可以通过 capability 的形式展现出来:

复制代码
// Old way
// Bundle-RequiredExecutionEnvironment: JavaSE-1.6
// New way
Require-Capability: osgi.ee;filter:="(&(osgi.ee="JavaSE")(version>=1.6))"

出于通用性的考量,OSGi 4.3 已经不建议使用 Bundle-RequiredExecutionEnvironment 了(但仍然存在)。

Remote Services

OSGi Remote Services 并非新特性(OSGi 4.2 纲要的第 13 章已经对其进行了介绍),但他们已经被加到了 OSGi 4.3 Core 规范当中了。这样,所有的 OSGi 4.3 运行时都将会支持 Remote Services。

适配

某些服务(如 PackageAdmin)用于提供关于 bundle 的元信息,同时又不会使用特定类型的访问符污染 bundle 的接口。这样我们通常都会使用一些样板代码来确定 bundle 是如何连接的,或是其起始层次是什么。

简化很重要,OSGi 4.3 为 Bundle 引入了一个 adapt(类)方法。类似于 Eclipse 的 IAdaptable 平台,Bundle 可以转换为已知类型。本质上,如果 bundle 知道如何将自身转换为给定类型,那它就会返回一个实例;如果不知道(或是没有权限),那么就会返回 null。这简化了 PackageAdmin 和 StatLevelAdmin,如下代码所示:

复制代码
BundleWiring wiring = bundle.adapt(BundleWiring.class);
// wiring.getRequirements(null)
BundleStartLevel bsl = bundle.adapt(BundleStartLevel.class);
// bsl.getStartLevel()

现有的服务依然可用,但推荐普通用户使用新的 adapt 模式以简化实现。

Weaving

Weaving 支持也得以实现,这样扩展就可以插入到其他 bundle 的类加载机制中了。某些运行时系统使用了该技术,尤其是那些实现了 JPA 或是数据库持久化存储的系统——为了创建特定于该类型的代码。凭借 Weaving 回调,我们可以将标准的机制插入到 OSGi 框架中,而之前使用的则是特定于提供商的机制。

嵌套框架遭抛弃

虽然 Equinox 中已经有了一个试用的实现,但嵌套框架支持(意即框架可以加载嵌套的版本)却被 4.3 规范所抛弃了。

但却引入了更加强大的 BundleHook 和 ResolverHook API,这样扩展就可以创建虚拟的 bundle 集合,使之相互不可见。这种想法来源于之前的 ServiceHook,它可以实现服务之间的隐藏。

这样就可以通过创建彼此不可见的 bundle 分组来模拟嵌套框架了。它已经用于实现新的 Virgo region model ,后者则重新实现以支持这种新模型。

其副作用是如果彼此不可见,那么它可能会在同一个框架中安装相同 bundle/version 的多个版本。此前,当尝试再次安装相同的 bundle 时会出现错误。默认情况下这是不行的,但却可以在加载框架时在属性文件中通过 org.osgi.framework.bsnversion=multiple 属性实现这一点。默认情况下,该属性是 org.osgi.framework.bsnversion=single。

总结

新的 OSGi 规范会为框架引入大量有用的特性;对于那些不需要支持老框架的 bundle 来说,新的泛型 API 极具吸引力,可以促成他们的转换。嵌套框架与 weaving 不太可能产生直接的效果,但那些实现底层库的 bundle 则会通过标准的回调转换到这上面来,这会增加不同的 OSGi 框架之间的平台交互性。

该规范尚未正式发布,但预计会在今年 Eclipse 发布前发布,因为 Equinox 3.7 很可能会成为参考实现。

查看英文原文: OSGi 4.3 brings some Generics and Capabilities

2011-03-31 10:022009
用户头像

发布了 88 篇内容, 共 262.3 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

一文读懂PINGPONG:0成本在普通家用机上运行多个网络节点

加密眼界

一文读懂PINGPONG:0成本在普通家用机上运行多个网络节点

股市老人

去中心化网络PINGPONG,让普通人也可以参与到节点运行并获益

BlockChain先知

如何在Ubuntu 20.04|18.04上安装FreeSwitch

百度搜索:蓝易云

Linux安装nginx

六哥是全栈

Linux NGINX 安装

淘宝商品评论API:深入探索商品使用场景与评价信息

代码忍者

一文读懂PINGPONG:0成本在普通家用机上运行多个网络节点

西柚子

未完待续

Anliven

职业发展 价值

智源研究院举办第二期“数据与行业应用Workshop”

智源研究院

有效阅读

Anliven

方法 个人提升 阅读

Mybatis-Plus常见注解

百度搜索:蓝易云

浅析Jetty与tomcat区别

百度搜索:蓝易云

数据工程(三):数据桥梁的基石——深度剖析数据集成与整合中的采集艺术

数造万象

数据治理 数据采集 数据集成 数据孤岛 数据工程

以低代码技术加速推动企业数字创新

快乐非自愿限量之名

低代码 数字化转型 企业转型

如何在Python程序中使用NFT资产服务API接口?

幂简集成

API NFT

一文读懂PINGPONG:0成本在普通家用机上运行多个网络节点

大瞿科技

一图看懂天润云(2167.HK)2024年中期业绩

天润融通

Databend Meta-Service 架构概述

Databend

Kuasar 最前沿:KubeCon China 2024 精彩回顾

华为云原生团队

云计算 容器 云原生

Linux中的chsh命令及示例

百度搜索:蓝易云

DockerCompose部署es和kibana

百度搜索:蓝易云

十五年以来 — 战略性云平台服务的演进路径之全面呈现(含亚马逊、微软和谷歌)

Moehoo猛虎

微软 AWS 云服务 Gartner 魔力象限

积硅步以致千里,积怠惰以致深渊

Anliven

成长 激励

天翼云HBlock:Step by step,一杯咖啡的时间轻松搭建企业存储集群

三掌柜

天翼云HBlock

一文读懂PINGPONG:0成本在普通家用机上运行多个网络节点

石头财经

活动火热报名中|搜索进化论:基于大模型的企业级AI搜索

阿里云大数据AI技术

人工智能 AI搜索 搜索开发工作台

Rust China Conf 2024

非凸科技

安装门槛极低!30分钟完成企业存储搭建

Swift社区

HBlock用户使用指南:盘活系统,解锁存储潜力

数字扫地僧

天翼云 HBlock 天翼云HBlock

火山引擎携手居然之家,共推家居行业的数智化发展

新消费日报

OSGi 4.3引入了Generics与Capabilities_Java_Alex Blewitt_InfoQ精选文章