我正在尝试使用maven-bundle-plugin
的功能将一些JAR嵌入到单个OSGi包中令我担心的是,嵌入式JAR的所有包都放入生成的MANIFEST.MF的Import-Package头中。
如果我明确指定只使用我需要的软件包,例如以下代码段:
Import-Package: org.osgi.framework
构建失败并出现BND错误(未解析的引用)。
所以,这里的问题是如何使用我需要的“Import-Package”标头构建带有嵌入式JAR的包?
答案 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]