api和实现常规做法是单独的OSGI包吗?

Tho*_*nne 16 osgi

我有一个依赖项的类,我想热部署而不重新启动依赖项.该类有一个接口,但只有一个具体的实现.

最初我创建了一个包,导出了接口,并使用未导出的激活器和实现类注册了实现.但是,如果我更新捆绑包,则在调用PackageAdmin#refreshPackages时更新后会重新启动使用已注册服务的捆绑包(这在使用fileinstall时是自动的).

我通过创建一个单独的api包来解决这个问题.

这是实现这一目标的最佳方式吗?

你有没有一个捆绑导出它的api并包含在同一捆绑中的实现.据我所知,任何给出的bundle都会导出它的所有类或没有类.我错过了什么?

Rya*_*oss 20

将API包与OSGi中的实现分开绝对是一种最佳实践.如果这样做,那么使用API​​的任何bundle只需要从API包中导入类,这可以允许您在运行时更改实现而无需重新启动依赖包.

理想情况下,您的实现包将在API提供的接口上实现接口和导出实现作为服务.这允许客户端捆绑包使用该服务而无需引用实现捆绑包.

  • 我同意100%这个答案,但我想让它更明确一点.在理想的OSGi世界中,只有两种捆绑.一个包含*纯API*(即只是接口和异常),并导出这些包.另一种捆绑包是实现捆绑包,它导出*nothing*,使用服务与其他捆绑包进行交互.请注意,在许多情况下,将多个API合并到一个包中是完全可以接受的. (9认同)

Ber*_*taz 9

Apache Sling中我们都做了两件事:主要API都在他们自己的包中,但是对于扩展或可选组件这样的小东西,我们经常在与API相同的包中提供默认实现.

在后一种情况下,您仍然可以允许这些默认服务可替换,例如,当您要覆盖它们时使用服务排名值.

bundle不必导出它的所有类,我们的包括默认服务的bundle只导出API包(显然,默认实现在不同的包中).