如何从eclipse / osgi应用程序中包含对jar文件的依赖?

我创建了一个Eclipse 4应用程序,我需要一个提供function的jar作为我的应用程序的一部分(这可能是任何东西,例如log4j ,使其变得微不足道)。
我添加了jar作为项目类路径的一部分( Right Click->Configure Build Path ),但在运行时我的服务失败并出现ClassNotFound错误(我猜是来自OSGI?)。
无论如何,搜索到这一点,至少据我所知,我应该将jar作为另一个Plugin一部分添加,并从我的应用程序/服务创建一个依赖于这个新插件。
即我Plugin Project from Existing JAR archives创建了一个Plugin Project from Existing JAR archives
这次设置工作。
因此,如果我理解这一点,在为Eclipse / OSGi开发时,我们不应该直接在类路径中添加jars ,而是通过插件添加它们(为什么?)。
问题:如果到目前为止我是正确的,在开发项目时包含jars的标准做法是什么?
Plugin Project from existing JAR archives定义/创建一个Plugin Project from existing JAR archives并添加所需的所有必需的第三方库, 或者每个需要的jar 其他可能具有不同的插件项目???
对不起,如果我的术语不准确。 我是OSGi和Eclipse编程的新手

注意:谈论jars我不是指其他OSGi服务。 我指的是使用应用程序的许多部分所需的准备好的,可靠的第三方库的规范。 例如log4j或xml解析库或apache commons

对于运行时,它总是Manifest和那里的头控制bundle类路径中的内容。 有三种方法可以访问jar:

  1. Import-Package标头。 这是推荐的方式。 您需要为每个包定义一个导入。 您要访问的jar必须作为bundle在运行时中部署。 它还需要导出所有需要的包。

  2. 需要捆绑。 这是访问捆绑包的另一种方法。 您可以定义所需包的ID,并查看它导出的所有包。 由于Require-Bundle会将您与其他bundle绑定得更紧密,因此应首选Import-Package方式。

  3. Bundle-Classpath。 这允许将jar添加到嵌入到自己的包中的类路径中。 当另一种方式不起作用时,这应该只是最后的手段。 将此与其他方法混合时,您可能会遇到令人讨厌的类加载问题。

你可以在maven中心找到许多预建的捆绑包。 今天许多jar子已经包含OSGi清单。 对于不适用的情况,许多jar子由servicemix重新打包为捆绑包。 请参阅groupId:org.apache.servicemix.bundles。 还有Spring bundle存储库,您可以在其中找到更多信息。

下面我列出了一些您可能想要阅读的资源:

http://www.aqute.biz/Blog/2007-02-19

http://wiki.osgi.org/wiki/Import-Package

http://wiki.osgi.org/wiki/Require-Bundle

http://www.vogella.com/blog/2009/03/27/required-bundle-import-package/

您提到的示例可以作为OSGi包使用,因此您无需自己进行捆绑。 您通常不在OSGi中使用直接jar依赖项,通常使用包或包依赖项。 在您所指的log4j示例中,您应该使用import package ,因为可以有多个bundle提供程序(较新的log4j jar,springource捆绑版本的旧log4j,slf4j实现…)。 这将断开您与实际提供程序的代码依赖关系。

这些依赖项是通过您的清单维护的,而不是您的项目类路径。 在eclipse插件项目中,项目构建类路径是从清单中的条目派生的。

即使您没有使用服务,所有代码依赖性仍然通过清单维护。

Extactaly我们在项目中遇到的同样问题。 我们有一些不兼容OSGi的遗留jar,我们创建与BundleContent并行的lib文件夹并将其添加到manifest的classpath部分。

 Bundle-ClassPath: ., /lib/.jar 

如果只有一个捆绑包将消耗它,则无需不必要地导出和导入包,