BND 将相同的包放入 manifest.mf 的导出和导入部分

Posted

技术标签:

【中文标题】BND 将相同的包放入 manifest.mf 的导出和导入部分【英文标题】:BND puts the same package to both export and import sections of manifest.mf 【发布时间】:2011-11-14 12:41:20 【问题描述】:

我有一个 Vaadin 应用程序,我正在尝试使用 Maven + BND 将其构建为一组 OSGI 包。

我无法将捆绑包部署到 Apache Felix,因为某些依赖项无法解决。 Apache Felix 抱怨找不到包“A”所需的包 XYZ,尽管这个包是在同一个包中定义的!!

我查看了由 Maven + BND 生成的 MANIFEST.MF 文件,发现此捆绑包中的包 (XYZ) 已添加到“导入”和“导出”部分。我明白为什么“出口”,但为什么“进口”?为什么捆绑包尝试导入自己的包?

我的清单.MF

Manifest-Version: 1.0
Export-Package: myexample.admin;uses:="com.vaadin.ui,myexample.webshared,
 com.vaadin.terminal,myexample.mvc.view.impl,
 myexample.mvc.model,myexample.mvc.renderer.map.impl,
 myexample.mvc.renderer,myexample.mvc.model.impl,myexample.util"
Built-By: ask
Tool: Bnd-0.0.384
Bundle-Name: admin
Created-By: 1.6.0_21 (Sun Microsystems Inc.)
Bundle-Version: 0
Build-Jdk: 1.6.0_26
Bnd-LastModified: 1315674240833
Bundle-ManifestVersion: 2
Import-Package: myexample.admin;version="1.0",myexample.mvc.model,
 myexample.mvc.model.impl,myexample.mvc.renderer,
 myexample.mvc.renderer.map.impl,myexample.mvc.view.impl,
 myexample.util,myexample.webshared,com.vaadin.terminal,com.vaadin.ui
Bundle-SymbolicName: admin
Include-Resource: ..\classes
Originally-Created-By: Apache Maven Bundle Plugin

【问题讨论】:

请发布您的 BND 设置(osgi.bnd 文件,相关的pom.xml 部分)。 【参考方案1】:

尼尔当然是正确的。不过老实说,我在使用 noimports:=true 来解决这个问题方面非常成功。在我的应用程序中,我的 maven-bundle-plugin 部分通常有以下内容:

<Export-package>*;noimports:=true</export-package>

这会导致你所有的包都被导出到 OSGi 中,并且它们都不会出现在你的 import-package 部分。如果您只需要几个导出的包不出现在 import-package 部分,则可以为每个单独的包设置 noimports 标志。最后,此语法来自 BND,因此它也应该适用于您的 .bnd 文件。

【讨论】:

【参考方案2】:

这是正确的行为。解释在 OSGi 核心规范的第 3.5.6 节。

关于 Felix 未解决的错误......这一定与其他事情有关。请发布实际的错误消息。

【讨论】:

'ERROR: Bundle admin [1] Error starting file:/C:/1-felix/bundle/admin-1.0.jar (org.osgi.framework.BundleException: Unresolved constraint in bundle admin [ 1]:无法解析1.0:缺少需求[1.0]包;(package=myexample.mvc.model)[原因:无法解析16.0:缺少需求[16.0]包;(&(package=myexample.mvc.controller )(version>=1.0.0))]) org.osgi.framework.BundleException:捆绑管理 [1] 中未解决的约束:无法解决 1.0:缺少要求 [1.0] 包; (package=myexample.mvc.model) [引起:无法解析16.0:' 缺少要求 [16.0] 包; (&(package=myexample.mvc.controller)(version> =1.0.0))] 所以,请阅读错误内容。您的 admin 包无法解析,因为包 myexample.mvc.model 不可用。该包似乎已由包 16 导出,但包 16 无法解析,因为包 myexample.mvc.controller 不可用。 bundle 16 有 myexample.mvc.model 和 myexample.mvc.controller 包,并且它会导出它们,即使没有在“导出”部分指定版本号(我 猜 默认为“1.0.0”?)。另一方面,导入部分需要“1.0”: Import-Package: myexample.mvc.controller;version="1.0" 这可能是原因吗?如果是,那么为什么 BND 插件在将其放入“导入”部分时会生成没有“1.0”版本标签的“导出”元素? @EmilLundberg 我从 R4.2 核心规范中获取了该部分编号。看起来它在 R4.3 中移到了 3.6.6。

以上是关于BND 将相同的包放入 manifest.mf 的导出和导入部分的主要内容,如果未能解决你的问题,请参考以下文章

MANIFEST.MF文件详解

MANIFEST.MF 文件内容完全详解(转)

JAR包中的MANIFEST.MF文件详解以及编写规范

Jar文件 META-INF/MANIFEST.MF文件详解

MANIFEST.MF文件详解

在 Java 中使用 MANIFEST.MF 文件