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

时间:2012-09-24 16:51:29

标签: java eclipse plugins eclipse-plugin osgi

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

  4. 你可以在maven中心找到许多预建的捆绑包。今天许多罐子已经包含OSGi清单。对于不适用的情况,许多罐子由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/

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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

Bundle-ClassPath: .,

 /lib/<legacy jar>.jar

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