【发布时间】: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