9

我创建了一个 Eclipse 4 应用程序,并且我需要jar提供一个功能作为我的应用程序的一部分(这可以是任何东西,例如log4j让它变得微不足道)。
我添加了jar作为我项目类路径(Right Click->Configure Build Path)的一部分,但在运行时我的服务因ClassNotFound错误而失败(我猜是来自 OSGI?)。
无论如何搜索结果,至少据我所知,我应该将 jar 添加为另一个 jarPlugin并创建从我的应用程序/服务到这个新插件的依赖项。
即我创建了一个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

4

3 回答 3

5

对于运行时,它始终是 Manifest 和那里的标头,它们控制着你的包类路径中的内容。可以通过三种方式访问​​ jar:

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

  2. 要求捆绑。这是访问捆绑包的另一种方式。您定义所需捆绑包的 ID 并查看它导出的所有包。由于 Require-Bundle 将您更紧密地绑定到另一个捆绑包,因此应该首选 Import-Package 方式。

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

您可以在 maven Central 中找到许多预构建的捆绑包。今天的许多 jars 已经包含一个 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/

于 2012-09-25T06:52:19.917 回答
3

您提到的示例可作为 OSGi 捆绑包提供,因此您无需自己将它们捆绑在一起。您通常不会在 OSGi 中使用直接的 jar 依赖项,而是通常使用包或捆绑包依赖项。在您所指的 log4j 示例中,您应该使用导入包,因为可以有多个捆绑提供程序(较新的 log4j jar、较旧的 log4j 的 springsource 捆绑版本、slf4j 实现......)。这将使您的代码依赖项与实际提供程序断开连接。

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

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

于 2012-09-24T17:09:36.220 回答
3

我们在项目中遇到的问题完全相同。我们有一些不兼容 OSGi 的遗留 jar,我们创建与 BundleContent 平行的 lib 文件夹并将其添加到清单的类路径部分。

Bundle-ClassPath: .,

 /lib/<legacy jar>.jar

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

于 2012-09-27T06:23:44.747 回答