【问题标题】:Embedding JARs in an OSGi Bundle in Eclipse在 Eclipse 的 OSGi Bundle 中嵌入 JAR
【发布时间】:2015-01-08 08:02:52
【问题描述】:

我需要在我在 Eclipse 中开发的 OSGi 包中嵌入一个第三方 JAR 文件。我进行了很多搜索和阅读,并且一遍又一遍地看到相同的东西:

  1. 我真的不应该这样做。这不是 OSGi 做事的“方式”。
  2. 实际上很容易做到。只需将 JAR 嵌入包的根目录并在清单中指定 Bundle-ClassPath: ., jar_filename.jar

好的。除了我嵌入的 JAR 很小,不太可能被我将在这个封闭系统上实现的任何其他东西使用,因此嵌入它要容易得多,因此用户只需下载一个包(易于使用) -用户至关重要)。所以我要打破常规,嵌入它。

现在,在 IDE 中,一切都是洁净的。我将 JAR 放到了我的 Eclipse 项目的 src 文件夹中,并配置了项目的构建路径以使用“添加 jar”按钮(不是“添加外部 jar”,因为我相信这将使用绝对路径)的“配置构建路径”对话框。我还在清单文件中添加了Bundle-ClassPath 行。在 IDE 中,我的所有导入都可以正常解析(因为它位于构建路径中),但是当我将其导出为捆绑包(默认选项)时,错误日志显示无法解析导入。

我检查了生成的最终捆绑 JAR 文件,第三方 JAR 按预期嵌套在内部(在根目录),但是一旦它尝试从该库导入对象,它就会失败。

下面是我的(非常基本的)MANIFEST.MF。我错过了什么吗?除了在捆绑类路径中列出它之外,我还需要将它列为导入包吗?我需要导出它(为什么?)?我是否误用了 bundle-classpath?因为我使用的是 Eclipse,我需要做一些不同的事情吗?

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ZWave Demo
Bundle-SymbolicName: com.wbarlow.zwavedemo
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.wbarlow.zwavedemo.internal.Activator
Bundle-Vendor: WBARLOW
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .,
 rxtx-2.1.7.jar

编辑:我通过使用 GUI 重新执行所有操作而不是直接编辑 .MF 文件来解决这个问题。我猜当你这样做时 Eclipse 会设置一些后台配置。

【问题讨论】:

  • 不要对嵌入 JAR 感到难过,因为您指出的原因,这完全没问题。通过嵌入这些微小的实现依赖项(并隐藏它们!),您可以使您的捆绑软件更易于使用。不幸的是,使用 Bundle-ClassPath 不是很好,但除非您使用 bnd/Bndtools,否则很难只包含适当的类。
  • Eclipse 缓存 MANIFEST.MF。因此,在重新启动 Eclipse 之前,编辑它几乎没有效果:/

标签: java eclipse eclipse-plugin osgi osgi-bundle


【解决方案1】:

而不是将 .JAR 放在项目的 src 文件夹中并直接编辑清单文件以引用它,就好像它在根目录中一样(即使它确实在包的根目录中,显然这不起作用),我能够通过使用 Eclipse 的图形清单编辑器来解决这个问题。

  1. 将外部 JAR 放在 Eclispe 项目的根目录中。
  2. 在 Eclipse 中打开 META-INF/MANIFEST.MF 文件。
  3. 在“运行时”选项卡上,选择“添加...”并添加您的外部 JAR。

【讨论】:

    【解决方案2】:

    您需要一个“导出包”条目来说明哪些包可用于其他插件。

    您可以在 Eclipse MANIFEST.MF 编辑器中的“运行时”选项卡的“导出的包”表中指定此项。

    【讨论】:

    • 当我希望其他包能够引用我的包中的内容时,我认为使用了 export-package。我只是在内部使用第三方 JAR,所以我不需要将它暴露给其他 bundle,为什么需要导出它?
    • 感谢您的帮助。我确实尝试过这样做(我将第三方 JAR 的命名空间添加到导出的包表中),但并没有解决问题。
    • 我找到了一种解决方法(见我的编辑;日食很痛苦)。很抱歉浪费您的时间,感谢您的帮助。
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2016-07-20
    • 2011-07-28
    • 2013-02-10
    相关资源
    最近更新 更多