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