以编程方式更改OSGi包导入

时间:2013-07-05 17:43:10

标签: java osgi classloader equinox

我的Equinox OSGi应用程序中有一个共同的包(A),用于一项常见任务。但是捆绑包A根据环境从许多其他捆绑包中导入包。我的意思是,当Bundle A和Bundle B在运行时中时,A应该导入包“com.b.package1”。当Bundle A和Bundle C在运行时中时,A应该导入包“com.c.package2”。为此,每次我想要更改运行时,我都必须手动更改bundle A中MANIFEST.MF文件中的import语句。有没有办法以编程方式处理这个问题。也许在捆绑A中使用自定义类加载器?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

您应该考虑将B和C实现为OSGi服务。

尝试获取静态内容的动态行为,可能是架构问题的暗示。

答案 1 :(得分:1)

要回答您的问题,不可能以独立于框架的方式创建自定义捆绑类加载器。但是,还有其他选择。

一种可能的方法是使用动态导入。然后可以在运行时访问这两个包。使两个导入可选也可能有效。

您还应该查看您的方法(或声明服务)的OSGi服务。

答案 2 :(得分:1)

事实上,这指向了建筑问题。特别是已知hibernate要求您使用动态导入来访问您的jpa实体。在即将推出的版本中,hibernate团队承诺提供更好的OSGi支持,但是现在它在OSGi中非常糟糕。

所以我建议切换到OpenJPA或Eclipselink并使用Aries JPA创建JPA EntityManager。这样,每个bundle就会创建EntityManager,您可以将其作为服务注入。如果需要,它还负责容器管理的持久性。所以你几乎可以在Java EE中使用JPA。

参见http://aries.apache.org/modules/jpaproject.htmlhttp://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access