2009-10-07 60 views
1

如何将软件包添加到代码中的软件包导入中?我需要它,因为我使用依靠反射和需要其他软件包的库,而且我不想手动将这些软件包添加到MANIFEST.MF,对于我开发的每个软件包OSGi:以编程方式将导入添加到软件包中

+0

你似乎是在涉及OSGi时忽略了大局的一部分:依赖关系被明确声明。 – SteveD 2009-10-09 17:06:54

回答

3

您不能。 导入包在解决阶段进行评估。 (阶段安装 - >解决 - >活动)。

您的代码在捆绑包处于活动状态时执行,因此添加导入包的时间太晚。

你可以做两件事情:

  • ImportPackage的包,你要使用
  • 使用动态ImportPackage属性指定的包,其分辨率可以推迟到执行时间
+0

Dynamic-ImportPackage的使用是不鼓励的,因为它比OSGi试图修复的扁平类路径问题要好一些。 – SteveD 2009-10-09 17:06:15

0

除了Filippo的解决方案,您可以尝试反转依赖关系。 F.i.而不是调用和检查其他包,你可以让捆绑包做到这一点。另一种方法是使用捆绑追踪器并获取追踪的捆绑包的ClassLoader。有了这个类加载器,你可以“作为捆绑”,所以你不再需要Import-Package子句。

当我开始使用OSGi时,这是我提出的第一个要求之一。随着时间的推移,我意识到在几乎所有情况下,都有一个更清晰和更一致的解决方案。所以,想想看,如果你真的需要这种依赖。是否没有办法将其转换或抽象为创建通用解决方案?

如果没有任何帮助(作为最后的手段),您还可以创建(在内存中)一个包含核心包的片段作为主机,提供所需的导入。 BundleContext为您提供了一种从流中加载包的方法。然后,您必须更新并在您的主机捆绑包上调用refreshpackages(通过PackageAdmin服务)以获取更新的ClassLoader(意味着重新启动捆绑包)。但是,最后,您将可以访问所有包。

作为一个方面说明,我不会推荐通过调整import语句来操作主机捆绑包,然后更新...这会使您的捆绑包不确定,并且不会使用已签名的捆绑包。此外,这是对一切从一个OSGi的预期(想象一个不断增长的包随着时间的推移......你需要收缩在某些时候进口以及!!!)

干杯, 米尔科

+0

我使用的一些第三方库使用我的bundle的类加载器来查找他们自己的类。这适用于WAR环境,而不是OSGi。我最终需要将这些软件包添加到我的软件包中。随着我开发越来越多的捆绑包,这变得乏味。 – IttayD 2009-10-14 10:33:05

+0

好吧,所以它是这样的: 捆绑(3rdP) - >捆绑(我) - >捆绑(3rdP) 所以它就像记录。 3rdP是一些提供HelloWorld和特定LogFormatter的组件,其中“me”提供了日志API。 HelloWorld调用Logging API,这需要格式化程序来打印日志输出。 有几种方法可以解决这个问题: - 为所需的类加载器提供参数(在“我”中) - 提供带有外部查询服务的查询服务。贡献者 - 一个ClassTracker(追踪所有包并检查在哪里找到要加载的特定类 - 难以实施,版本控制在这里是个问题) – 2009-10-15 13:32:47

相关问题