我有一个依赖项的类,我想热部署而不重新启动依赖项.该类有一个接口,但只有一个具体的实现.
最初我创建了一个包,导出了接口,并使用未导出的激活器和实现类注册了实现.但是,如果我更新捆绑包,则在调用PackageAdmin#refreshPackages时更新后会重新启动使用已注册服务的捆绑包(这在使用fileinstall时是自动的).
我通过创建一个单独的api包来解决这个问题.
这是实现这一目标的最佳方式吗?
你有没有一个捆绑导出它的api并包含在同一捆绑中的实现.据我所知,任何给出的bundle都会导出它的所有类或没有类.我错过了什么?
Rya*_*oss 20
将API包与OSGi中的实现分开绝对是一种最佳实践.如果这样做,那么使用API的任何bundle只需要从API包中导入类,这可以允许您在运行时更改实现而无需重新启动依赖包.
理想情况下,您的实现包将在API提供的接口上实现接口和导出实现作为服务.这允许客户端捆绑包使用该服务而无需引用实现捆绑包.
在Apache Sling中我们都做了两件事:主要API都在他们自己的包中,但是对于扩展或可选组件这样的小东西,我们经常在与API相同的包中提供默认实现.
在后一种情况下,您仍然可以允许这些默认服务可替换,例如,当您要覆盖它们时使用服务排名值.
bundle不必导出它的所有类,我们的包括默认服务的bundle只导出API包(显然,默认实现在不同的包中).
| 归档时间: |
|
| 查看次数: |
3935 次 |
| 最近记录: |