osgi bundle的编译时与运行时的依赖

bundle之间存在耦合,就必然存在依赖关系,由于osgi特殊的classloader组织结构,osgi的bundle之间及bundle内部的依赖关系稍微比传统java应用稍微复杂点。
   
首先,在传统java应用中,在运行时,大部分jar包都是由同一个classloader来加载,所以它们在编译时和运行时时的依赖关系基本上是一致的,也就是说你编译通过了,在运行时,如果将编译时需要的jar包加载了,就一般不会存在在ClassNotFound之类的问题,所以通常做传统java应用开发的开发人员不需要或较少理会“编译时”和“运行时”两个阶段。
   
而在osgi语境下,编译时依赖和运行时依赖通常存在较大差别。 假设我们以maven来管理bundle的工程项目。

首先,bundle的编译是和manifest.mf无关的,无论manifest.mf里作了任何设置,都只会被原样打包到目标bundle里,编译器根本不会去解析manifest.mf。bundle编译时只与maven里的pom指定的依赖相关,如果bundle里的代码中引用了第三方包,那么pom里就需要显式指定或隐式地继承对这个第三方包的依赖。否则就无法编译通过。

而在运行时,bundle的状态从installed,到resolved,再到active。在installed到resolved的迁移过程中,需要满足manifest.mf中的import-package的条件,也就是必须有其它bundle export出这些packages,否则无法resolved。所以,bundle的运行时的依赖首先就是由manifest.mf里的import-package指定了(Bundle-Required等项也限定了)。而这时,原来在maven的pom.xml里指定的依赖关系不会影响bundle的resolve过程。

从上面分析可知,bundle的编译时和运行时的依赖关系是有区别的。 如果我们在maven的pom.xml中指定了多余的依赖关系,一般并不影响bundle的编译(除非有包的冲突)。但如果在manifest.mf的import-package里指定了多余的package,就可能会导致bundle无法resolved。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值