使用maven-bundle-plugin将JAR嵌入到OSGi包中

时间:2009-09-04 10:45:26

标签: maven-2 osgi

我正在尝试使用maven-bundle-plugin

的功能将一些JAR嵌入到单个OSGi包中

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

如果我明确指定只使用我需要的软件包,例如以下代码段:

Import-Package: org.osgi.framework

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

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

4 个答案:

答案 0 :(得分:9)

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

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

maven中的maven bnd配置。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:5)

如果要在包含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中的任何包,除非您实际导出它们

答案 3 :(得分:2)

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

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

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

Import-Package: ![package_name]