如何让所有类在特定的OSGi Bundle中实现接口

时间:2016-01-22 07:13:40

标签: java osgi osgi-bundle

我有一个名为' Foo'我有一个捆绑' b'。

现在我想让所有类实现接口' Foo'在捆绑b

如下所示

org.osgi.framework.Bundle bundle = ...;
List<Class<? extends Foo>> allImplemetation = getAllImplementation(bundle);

1 个答案:

答案 0 :(得分:3)

  1. 在OSGi中查找实现的简洁方法是让每个bundle将每个实现发布为OSGi服务。这允许将impl类保持为私有,并确保您的中心包与用户包很好地分离。 Here you can find some guidance how to do this

  2. 如果无法做到这一点,那么您可以使用BundleTracker在安装新捆绑包时收到回电。然后,您可以使用Javassist或XBean finder扫描实现和接口的类的bundle类路径。尽管如此,这种变体很难做到。所以我会尽量避免它。

  3. 一种中间道路解决方案是使用与ServiceLoader相同的方法。您可以在jar中的特殊目录中创建一个文件,其中包含要加载的实现的类名。然后,您可以使用上面的BundleTracker查找新安装的bundle,读取此资源,然后使用bundle的ClassLoader加载实现类。