且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《深入理解OSGi:Equinox原理、应用与***实践》一2.6 定义执行环境

更新时间:2022-09-30 13:21:32

2.6 定义执行环境

某些Bundle必须在特定的执行环境之下才能正常运作,例如为大型服务端应用而设计的Bundle一般不能运行在嵌入式设备之中,而利用JDK1.6开发的Bundle无法运行在JDK1.5的应用服务器之中等。为了确保Bundle可用性,元数据信息中提供了Bundle-RequiredExecutionEnvironment标记来描述Bundle对执行环境的要求,示例如下:
Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0
OSGi对执行环境定义的命名是直接继承于Java平台的执行环境名称,如图2-17所示为Eclipse配置界面中执行环境与JRE关联的设置对话框。
对于每一个执行环境,在OSGi框架中应该对应一套系统运行参数的默认配置。前面提到过的org.osgi.framework.bootdelegation、org.osgi.framework.system.packages等参数的默认值都由执行环境决定。以Equinox框架为例,对于JavaSE-1.6这个执行环境,在Equinox框架中对应的配置存储在JavaSE-1.6.profile文件中,内容为:

org.osgi.framework.system.packages = \
 javax.accessibility,\
 javax.activation,\
 javax.activity,\
 javax.annotation,\
……//版面关系,省略其余的Package
org.osgi.framework.bootdelegation = \
 javax.*,\
 org.ietf.jgss,\
 org.omg.*,\
 org.w3c.*,\
 org.xml.*,\
 sun.*,\

《深入理解OSGi:Equinox原理、应用与***实践》一2.6 定义执行环境

 com.sun.*
org.osgi.framework.executionenvironment = \
 OSGi/Minimum-1.0,\
 OSGi/Minimum-1.1,\
 OSGi/Minimum-1.2,\
 JRE-1.1,\
 J2SE-1.2,\
 J2SE-1.3,\
 J2SE-1.4,\
 J2SE-1.5,\
 JavaSE-1.6
org.osgi.framework.system.capabilities = \
 osgi.ee; osgi.ee="OSGi/Minimum"; version:List<Version>="1.0, 1.1, 1.2",\
 osgi.ee; osgi.ee="JavaSE"; version:List<Version>="1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6"
osgi.java.profile.name = JavaSE-1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.source=1.6
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

在OSGi R4.3规范发布后,元数据对执行环境的描述能力被进一步增量,引入了通用Capability的概念,通过Require-Capability和Provide-Capability两个新的标记也可以定义执行环境,例如:

#R4.3之前的方式:
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

#R4.3新提供的方式:
Require-Capability: osgi.ee;filter:="(&(osgi.ee="JavaSE")(version>=1.6))"

定义了Require-Capability之后,OSGi框架在解析Bundle之前必须满足必要的Capability需求。典型使用场景是提供OSGi的声明式服务,该服务并不会表示为Package依赖,但为了能够正确解析Bundle,它又是必需的。