【问题标题】:Embedding JARs into the OSGi bundle with maven-bundle-plugin使用 maven-bundle-plugin 将 JAR 嵌入到 OSGi 包中
【发布时间】:2010-11-25 14:18:37
【问题描述】:

我正在尝试使用maven-bundle-plugin 的功能将一些 JAR 嵌入到单个 OSGi 包中

让我担心的是所有嵌入式 JAR 包都放入生成的 MANIFEST.MF 的 Import-Package 标头中。

如果我明确指定只使用我需要的包,比如下面的 sn-p:

Import-Package: org.osgi.framework

构建失败并出现 BND 错误(未解析的引用)。

那么,这里的问题是如何构建带有我需要的“Import-Package”标头的嵌入式 JAR 包?

【问题讨论】:

  • 能否发布您使用的 maven-bundle-plugin 说明?

标签: maven-2 osgi


【解决方案1】:

当您将 JAR 嵌入到您的包中时,您可以从 import-package 范围中删除一些包:

<Import-Package>![package_name9]<Import-Package>

在 pom.xml 中或者如果您使用外部 *.bnd 文件:

Import-Package: ![package_name]

【讨论】:

    【解决方案2】:

    如果你想让类在包含 JAR 的包中可用,你应该使用 Bundle-ClassPath,例如

    Bundle-ClassPath: foo.jar,other.jar
    Import-Package: org.osgi.framework,org.other.imported
    

    您需要列出 foo.jar 和 other.jar 导入/使用的类,但您不需要列出 foo.jar 或 other.jar 中的任何包,除非您实际导出它们.

    【讨论】:

    • 对。问题是 maven OSGi 插件(构建在 bnd 工具之上)确实为 foo.jar 和 other.jar 中的每个包创建 Import-Package!
    • 您可以配置 bnd 不为某些包生成导入语句。您可能还想尝试针对此示例提出针对 BND 的错误。
    【解决方案3】:

    您在 Import-Package 标头中看到“意外”包的一个可能原因如下:

    在 OSGi 中支持协作模型的一般良好做法是导入您导出的所有包 -- 请参阅 Peter Kriens 的 this blog post 了解详细说明。 Bnd(因此也是 maven-bundle-plugin)默认遵循这种做法并自动导入所有导出的包。因此,您应该首先检查您的 Export-Package 标头并确保只导出您想要的包。

    此外,如果您想从嵌入式依赖项中导出包,那么您应该小心避免在您的包中出现重复 - 请参阅 maven-bundle-plugin 文档的 Embed-Dependency and Export-Package 部分。

    【讨论】:

    • 也许你是对的......下次我点击这个时会检查。目前我们决定不使用自动生成的清单。
    【解决方案4】:

    在您的类中导入的所有包都将由 bnd 导入。也许您不希望导入这些包,因为知道在运行时您将不需要它们。如果您无法阻止 bnd 导入它们,则可以将它们设为可选,这样即使它们不是由另一个包提供(在线时),您的包仍然可以解析。尝试添加这个:

    <Import-Package>*;resolution:=optional<Import-Package>
    

    到你在 maven 中的 maven bnd 配置。

    【讨论】:

    • 我不希望它们被导入有两个原因:1)它们在同一个包中(在嵌入式 JAR 中),所以据我所知,我根本不需要导入它们!所以它只是在 MANIFEST.MF 中添加了一些垃圾,我希望它是干净的。 2)不希望它们被意外地从另一个包中导入。
    • 捆绑插件非常令人沮丧,直到我想通了。
    猜你喜欢
    • 2016-07-20
    • 2016-10-03
    • 2013-02-28
    • 2016-09-21
    • 2011-03-06
    • 1970-01-01
    • 2011-05-21
    • 2013-02-10
    • 2017-01-02
    相关资源
    最近更新 更多