【发布时间】:2015-01-08 08:02:52
【问题描述】:
我需要在我在 Eclipse 中开发的 OSGi 包中嵌入一个第三方 JAR 文件。我进行了很多搜索和阅读,并且一遍又一遍地看到相同的东西:
- 我真的不应该这样做。这不是 OSGi 做事的“方式”。
- 实际上很容易做到。只需将 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