Maven 2 使用maven bundle插件将JAR嵌入OSGi bundle

Maven 2 使用maven bundle插件将JAR嵌入OSGi bundle,maven-2,osgi,Maven 2,Osgi,我正在尝试使用的特性将一些JAR嵌入到单个OSGi包中 让我担心的是,所有嵌入JAR的包都被放入生成的MANIFEST.MF的导入包头中 如果我明确指定只使用我需要的包,如以下代码段中所示: Import-Package: org.osgi.framework 生成失败,出现BND错误(未解析的引用) 因此,这里的问题是,我如何使用我需要的带有“Import Package”头的嵌入式JAR构建包?在类中导入的所有包都将由bnd导入。也许您不希望导入这些包,因为您知道在运行时不需要它们。如果您

我正在尝试使用的特性将一些JAR嵌入到单个OSGi包中

让我担心的是,所有嵌入JAR的包都被放入生成的MANIFEST.MF的导入包头中

如果我明确指定只使用我需要的包,如以下代码段中所示:

Import-Package: org.osgi.framework
生成失败,出现BND错误(未解析的引用)


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

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

<Import-Package>*;resolution:=optional<Import-Package>
*;分辨率:=可选

在maven中查看maven bnd配置。

在导入包头中看到“意外”包的一个可能原因是:

在OSGi中支持协作模型的一般良好实践是导入您导出的所有包——请参阅Peter Kriens提供的详细解释。默认情况下,Bnd(以及maven bundle插件)遵循这种做法,并自动导入所有导出的包。因此,您应该首先检查导出包标题,并确保仅导出所需的包


另外,如果您想从嵌入的依赖项导出包,那么您应该小心避免包内的重复——请参阅maven bundle插件文档的一节。

如果您想在包含JAR的包内提供类,例如

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

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

将jar嵌入包时,您可以从导入包范围中删除一些包:

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

我不想导入它们有两个原因:1)它们在同一个包中(在嵌入式jar中),所以据我所知,我根本不需要导入它们!所以它只是在MANIFEST.MF中添加了一些垃圾,我希望它是干净的。2) 我不希望它们被意外地从另一个捆绑包导入。捆绑包插件非常令人沮丧,直到我发现这一点。你能发布你使用的maven捆绑包插件说明吗?对。问题是maven OSGi插件(构建在bnd工具之上)确实为foo.jar和other.jar中的每个包创建了导入包!您可以将bnd配置为不为某些包生成导入语句。在本例中,您可能还想尝试提出一个针对BND的bug。也许您是对的。。。我下次打这个的时候会查的。现在我们决定不使用自动生成的清单。
Import-Package: ![package_name]