首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用 OSGi 应用程序开发和工作的最佳实践 (6)

用 OSGi 应用程序开发和工作的最佳实践 (6)

10. 使用 WAB 而不是 WAR开发企业级 OSGi 应用程序时,创建一个 Web 应用程序 bundle (WAB),不依赖 WAR 进行 WAB 转换。
原因如下
WebSphere Application Server 的 OSGi 应用程序功能自动将一个 WAR 文件转换成一个 OSGi bundle,就是所谓的 Web 应用程序 bundle。在刚开始学习 OSGi 时,这个功能是很有用的,但是自动转换阻碍了某个功能的使用。因而,在开发过程中,WAR 文件应该被转换成一个 bundle 部署到生产系统中。
使用 OSGi bundle 时,应用程序可能显示一系列支持的 bundle。这样一来,不需要重新部署整个应用程序单独的 bundle 也可以更新。该功能取决于模块所拥有的一个已知特性,并不是自动转换,其中特性是在部署时生成的。
当一个 WAR 被转换成一个 WAB 时,包导入生成不可控的版本。结果,包可能捡起所需版本的二进制不兼容版本。如果一个包的版本 2 和版本 3 都可用,不可能阻止 WAR 使用版本 3。如果WAR 需要版本 2,而对版本 3 是不兼容的,这将导致运行时错误。
11.  必要时只使用 Use-Bundle(专用于 WebSphere Application Server)
创建一个 WebSphere Application Server OSGi 应用程序时,一个最佳实践是仅在共享场景 bundle 的一个特定子集中指定 Use-Bundle 应用程序清单头部。
原因如下
WebSphere Application Server Use-Bundle 应用程序清单头部提供一种方法,可以引导应用程序部署进程在导出相同包的其他 bundle 上执行一个 bundle。
在运行时,OSGi 应用程序彼此隔离,但是他们的依赖项是共享的。在 OSGi 应用程序的 Application-Content 头部指定的 bundle 运行在它们自己独立的 OSGi 框架中。依赖项运行在服务器的共享 bundle 空间。
在 OSGi 应用程序部署过程中依赖项被确定。在部署过程中,应用程序 bundle 导入的包匹配应用程序或配置的 bundle 存储库中的 bundle 导出的包。如果 bundle 存储库中需要一个 bundle,将它提供给服务器。由于包的版本约束,两个应用程序被部署和配置来运行是可能的,其中不同 bundle 在共享 bundle 空间中提供相同的包。如果两个应用程序需要使用类实例(来自所涉及的包)互相交互,这就变成了一个问题。如果是的话,那么 Use-Bundle 应用程序清单头部应该用于确保两个应用程序是连接到同一个 bundle 的。
指定 Use-Bundle 来实现应用程序之间的依赖项共享不是必须的。只需要在两个应用程序需要共享一个类的同一版本时,确保它们被连接到同一个提供的 bundle。
示例
例如,一个含有 Bundle X 的应用程序被部署,从 1.0 到 2.0(不包括 2.0)版本中导入一个 包 org.hal.a(图 13)。根据 OSGi 语义版本控制,这意味着 X 可以连接到任何导出 org.hal.a 的 bundle,而不会中断 API 更改,从用户角度使用 API。此时,只有一个 bundle API.A 导出 org.hal.a,在 1.0 版本中也是这样的。因此 Bundle X 被连接到 API.A。Bundle X 因此可以看得见 org.hal.a  版本 1.0 的实现。Implementation.A 是这类实现之一。
图 13. OSGi 将 Bundle X 连接到 API.A 来在可接收 Bundle X 的版本上提供 org.hal.a 然后,部署一个含有 Bundle Y 的应用程序(图 14)。Bundle Y 从 1.5 到 2.0 版本(但不包括 2.0)导入 org.hal.a 包。API.B 也被部署,在版本 1.5 中导出包 org.hal.a。Bundle Y 不能连接到 API.A ,因为它导入一个新的 org.hal.a 版本,但它 可以 被连接到 API.B。Implementation.B bundle 提供了一个 org.hal.a 1.5 版本的实现,从 1.5 到 1.6 版本(但不包括 1.6)导入。 对这一原因进行详细的讨论。
图 14. OSGi 将 Bundle Y 连接到 API.B 来在可接收 Bundle Y 的版本上提供 org.hal.a 然后,部署第 3 个应用程序,其中含有 Bundle Z。Bundle Z 从与 Bundle X 相同的版本导入 org.hal.a 包:从版本 1.0 到版本 2.0 但不包括 2.0(图 15)。Bundle Z 的编写者想要它使用 Implementation.A,但是由于 API.B 是在版本 1.5 上导出 org.hal.a 的(这处在 Bundle Z 的导入范围中),Bundle Z 能被连接到 API.B,随后只能看到 Implementation.B。
图 15. Bundle Z 被连接到 API.B,因此不能看到 Implementation.A为了确保 Bundle Z 连接到 API.A,Bundle Z 应该指定一个 Use-Bundle 应用程序清单头部:API.A,然后,Bundle Z 将获得对 Implementation.A 的可见性,而不是 Implementation.B。这就是作者想要的(图16)。
图 16. Bundle Z 被连接到 API.A,现在可以看到 Implementation.A
返回列表