《深入理解OSGi:Equinox原理、应用与最佳实践》一3.1 Bundle标识-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《深入理解OSGi:Equinox原理、应用与最佳实践》一3.1 Bundle标识

简介: 本节书摘来自华章出版社《深入理解OSGi:Equinox原理、应用与最佳实践》一 书中的第3章,第3.1节,作者:周志明 谢小明,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.1 Bundle标识

在模块层的讲解中,笔者介绍过Bundle的唯一标识是由Bundle-SymbolicName和Bundle-Version标记共同构成的。对于生命周期层,我们依然可以采用Bundle-SymbolicName和Bundle-Version标记来确定唯一的Bundle。不过,基于API使用方便的考虑,在运行期还可以采用其他Bundle标识进行定位,包括:
Bundle ID(Bundle Identifier)。Bundle ID是运行期最常用的标识符,尤其是在Equinox Console的命令中。它是由OSGi框架自动分配的一个长整型数字,在Bundle整个生命周期内(包括Bundle更新、卸载之后)都不会改变,甚至在OSGi框架重启后都能保留下来。Bundle ID是在Bundle安装过程中由OSGi框架根据Bundle安装时间的先后次序,由小到大进行分配的。在代码中可以通过Bundle接口的getBundleId ()方法来获取当前Bundle的ID。
Bundle位置(Bundle Location)。Bundle位置是OSGi容器在Bundle安装过程中分配给Bundle的定位字符串。这个字符串通常是该Bundle的JAR文件地址,但是这并不是强制性的。在一个OSGi容器中,每个Bundle的定位字符串都必须是唯一的,即使Bundle更新时改变了JAR文件的路径,也不会修改这个定位字符串,所以它可以唯一确定一个Bundle。在代码中我们可以通过Bundle接口的getLocation()方法来获取一个Bundle的定位字符串。
Bundle符号名称(Bundle Symbolic Name)。前面介绍过,Bundle的符号名称由开发人员设定,保存于Bundle元数据信息之中。它是静态的信息,在Bundle打包发布的那一刻它就被确定下来,不会因使用了不同的OSGi框架而有所不同(前面的Bundle ID和Bundle Location是由OSGi框架所决定的)。Bundle的版本与符号名称一起可以唯一定位一个Bundle,在代码中可以通过Bundle接口的getSymbolicName()方法获取当前Bundle的符号名称,通过getVersion()方法获取Bundle的版本号。
我们可以写一小段简单的代码,在Equinox框架中运行查看这3个唯一标识,示例如下:

System.out.println("Location:" + bundleContext.getBundle().getLocation());
System.out.println("ID:" + bundleContext.getBundle().getBundleId());
System.out.println("SymbolicName:" + bundleContext.getBundle().getSymbolicName());

输出结果为:

Location: initial@reference:file:../WorkSpaces/equinox/BundleA/
ID: 1
SymbolicName: BundleA

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: