【问题标题】:Programmatically changing OSGi bundle imports以编程方式更改 OSGi 包导入
【发布时间】:2013-07-03 21:05:42
【问题描述】:

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

【问题讨论】:

  • 为什么?如果捆绑 A 的行为取决于依赖捆绑 A 的现有捆绑的不同,那么您可能应该将捆绑 A 拆分为单独的捆绑,捆绑 AC 和捆绑 AB,它们都有自己的 MANIFEST.MF。如果我明白了,那就是重点。你不应该为了获得这种动态行为而执行奇怪的 Classpath 技巧,但你确实需要正确地构建你的包。
  • +1 @SheenaArtrip 的评论。绝对没有充分的理由去做你想做的事。
  • 是有原因的。 Bundle A 嵌入了数据库访问所需的休眠和许多实用程序类。但是实体类位于不同的包 (B 和 C) 中。这些实体在捆绑包的激活阶段被添加到 Hibernate 配置中。即使正确添加了实体,bundle A 也无法看到实体类,除非它们被显式导入。我希望能够添加另一个具有不同数据库实体类的包 D,而无需在包 A 中手动导入它。当我想删除 B 时,我不应该手动删除导入语句。
  • 动态导入解决了这个问题。非常感谢您的帮助:)。
  • 动态导入会给您带来更多麻烦。

标签: java osgi classloader equinox


【解决方案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+-+Database+Access

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多