2011-02-08 63 views

回答

22

由于这是写在以前的答案,你有两个选择,如果你想在你的包使用额外的库:

  1. 嵌入的jar包在其将要使用的捆绑,
  2. 创建来自库的有效OSGi包。

第一种方法是简单,因为你只需要库JAR(以及所有依赖的)复制到包(如到根目录),然后将它们MANIFEST.MF添加到Bundle-Classpath元素(见here) 。但是,在做这件事的时候,你必须记住,这个添加的库只能在它被嵌入的包中看到(所以库重用是有限的)。您始终可以将此库中的软件包添加到MANIFEST.MF中的Export-package元素中,以使其可用于其他软件包,但这远非优雅的解决方案(但它可行)。

为了使其他软件包可见,您应该使用第二种方法,即从库中创建一个OSGi包(在Eclipse中也有一些工具可以帮助您做到这一点)。但是,对于更复杂的库,这种方法可能更难(因为OSGi中依赖和特定的类加载方法)。

因此,如果你只想在一个包中使用库,我建议使用第一种方法(它更容易实现)。如果你想在应用程序的许多包中使用这个库,你应该考虑第二种方法。

3

是的,这是可能的。您有两种选择:

首先,您可以将所有来自外部库的软件包包含到软件包的专用软件包部分中。它将所有这些包与您的应用程序一起放入jar中。 第二个选择是从外部库制作一个有效的osgi包。

5

是的,您可以将外部库嵌入到您的软件包中,也可以将该库作为OSGi包装(“OSGIfy”)。对于这两个选项,Pax Construct(http://www.ops4j.org/projects/pax/construct)是一个很好的工具。

如果您的外部库本身具有依赖关系,请将所有这些内容嵌入到一个包中,或者使用Pax Construct将它们包装为可传递的。

如果必须在包装或嵌入之间进行选择,请考虑依赖关系管理和捆绑版本。如果您需要升级外部库并将其嵌入您自己的应用程序包中,则始终会同时释放库和您自己的代码。例如,如果没有激活应用程序包的2个版本,也可能无法激活2个库的版本。 还......如果你不在OSGi环境中工作,你想在应用程序罐中添加第三方类吗?那么为什么在OSGi环境中呢?

我个人更喜欢在这种情况下将外部库视为黑盒,并将库和它的依赖包装在一个包中。