要确定某个JAR包是否是一个合法的OSGi Bundle,首先要根据其元数据信息中的Bundle-ManifestVersion(注意,不是 ManifestVersion,ManifestVersion是JAR文件规范中定义的)来确定元数据信息的版本号。如果在元数据信息中没有指定 Bundle-ManifestVersion,那么其默认属性是1,表示遵循OSGi R3规范;如果Bundle-ManifestVersion为2,则代表遵循OSGi R4/R5规范;OSGi R4规范中添加了一些特定的标记。在将Bundle安装到OSGi系统的时候,必须对其进行有效性校验。下面列举一些(不完全包括)会导致Bundle有 效性校验失败的问题。
- 无法根据Bundle-RequireExecutionEnvironment的值找到一个可匹配执行环境。
- 在Bundle中没有设置Bundle-SymbolicName标记。
- 存在重复的标记。
- 对某个Package重复导入。
- Bundle导入或导出了以java.*开头的Package。
- 在Export-Package标记中用mandatory参数指明了某些强制属性,却没有定义这些属性。
- 尝试安装某个和OSGi框架中某个已经安装好的Bundle具有同样名称和版本的Bundle。
- 将某个Bundle更新为和OSGi框架中一个已经安装好的Bundle具有同样名称和版本的Bundle。
- 元数据信息中存在语法错误(例如,不合法的版本格式或Bundle名称)。
-
同时使用Specification-version和version参数,但是为它们指定了不一样的值,例如:
Import-Package p;specification-version=1;version=2
这将导致一个错误。而下面的指定:
Import-Package p;specification-version=1, q;version=2
不会导致错误。
-
在元数据信息中列出了权限文件:OSGI-INF/permission.perm,但此文件不存在。
- Bundle-ManifestVersion的值不等于1或2,在今后的OSGi规范中另有规定的情况除外。