1

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

4

3 回答 3

2

要回答您的问题,不可能以独立于框架的方式创建自定义捆绑类加载器。但是,也有可用的替代方案。

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

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

于 2013-07-05T20:24:06.083 回答
2

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

试图获得原本是静态的东西的动态行为,可能是架构问题的暗示。

于 2013-07-05T20:11:44.047 回答
1

事实上,这指向了架构问题。众所周知,hibernate 要求您使用动态导入来访问您的 jpa 实体。在即将发布的版本中,hibernate 团队承诺提供更好的 OSGi 支持,但目前它在 OSGi 中相当糟糕。

所以我建议切换到 OpenJPA 或 Eclipselink 并使用 Aries JPA 来创建 JPA EntityManager。这样,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+- +数据库+访问

于 2013-07-06T16:34:52.140 回答