OSGI 缺少需求错误
Posted
技术标签:
【中文标题】OSGI 缺少需求错误【英文标题】:OSGI missing requirement error 【发布时间】:2012-01-11 06:27:09 【问题描述】:我是 OSGI 新手,我正在尝试弄清楚如何解决如下错误
org.osgi.framework.BundleException:捆绑包 org.foo.serviceBundle [253] 中未解决的约束:无法解析 253.0:缺少需求 [253.0] 包; (&(package=org.slf4j)(version>=1.6.0)(!(version>=2.0.0)))
我使用了一个 maven 原型来生成一个包,并在我的 Activator 类中添加了一些简单的 slf4j 日志记录。我也在使用 maven bundle 插件,如下所示:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.2.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Activator>org.shoppingsite.Activator</Bundle-Activator>
</instructions>
</configuration>
</plugin>
我尝试了其他组合,但我得到了一个或另一个无法解析的包。我正在尝试将包部署到 GlassFish 应用服务器上。任何帮助将不胜感激
谢谢
【问题讨论】:
【参考方案1】:这通常意味着您缺少一个导出 org.slf4j 的包。这是整个工作流程:
maven-bundle-plugin 将确保您自己项目的清单导入 org.slf4j(因为您需要它)。
项目 POM 中的 maven 依赖项将确保下载 slf4j 工件
那么两件事可能会出错:
要么你的编译失败,要么没有找到 slf4j 工件(但我想你已经注意到了)
或者您下载的 slf4 工件没有 Manifest 或未导出 org.slf4j。要检查它,只需查看 org.slf4j 包的清单。如果您直接在 Eclipse 之类的 IDE 中运行,您可能需要签入 $HOME/.m2/ 来查找工件。
如果您的工件没有正确的清单,您将不得不找到其他一些您可以从中获取正确捆绑包的存储库,或者修改您获取的存储库并将其安装到您的本地存储库(并部署如果你有的话,它在你的本地 maven 包存储库(例如 nexus)上)
最后一点:考虑使用 maven-scr 插件,而不是直接定义激活器和服务发现。我希望我在开始使用 OSGi 时就知道这一点!
【讨论】:
感谢 Miquel 的回答,我现在有几件事要尝试:- 类编译,所以 slf4j 工件肯定存在.. 那么 Miquel,我在清单中寻找什么。清单似乎确实有必要的 OSGI 声明。 ~谢谢VDev 检查您的清单中是否有包含 org.slf4j 的名为 Export-Packages 的行。如果在那里,启动您的应用程序并获得一些控制台访问权限(对不起,我不知道您是如何在 glassfish 中做到这一点的)。然后查看控制台帮助中的一项功能,该功能可让您确定 (a) 您的捆绑包是否“解析”,也就是说,它是否具有所需的所有包。它可能会抱怨,所以检查 (b) slf4j 包导出的包。那里一定有问题,否则你不会得到那个错误..【参考方案2】:如果您不想为您使用的每个 3rd 方库创建捆绑包而烦恼,您可以将其编译到您的捆绑包中。试试
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.6</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Activator>org.shoppingsite.Activator</Bundle-Activator>
<Embed-Dependency>
slf4j-api;scope=compile,
log4j;scope=compile
</Embed-Dependency>
</instructions>
</configuration>
</plugin>
【讨论】:
【参考方案3】:我不确定 Grassfish 应用服务器。在 Fuse ESB 中,通过添加
【讨论】:
【参考方案4】:将
【讨论】:
那有什么帮助?provided
依赖关系仍然包含在 maven-bundle-plugin
的依赖关系计算中。以上是关于OSGI 缺少需求错误的主要内容,如果未能解决你的问题,请参考以下文章
启动捆绑包时缺少要求 osgi.wiring.package
无法启动 OSGi 包,缺少 com.ibm.uvm.tools
Jetty 更新到 9.4.x 后:缺少约束:Require-Capability: osgi.extender;过滤器:=“(osgi.extender=osgi.serviceloader.pro
OSGi 捆绑包未启动:缺少要求 osgi.wiring.package; > &(osgi.wiring.package=org.apache.felix.dm)
Java 8 & 缺少所需的能力 Require-Capability: osgi.ee;过滤器="(&(osgi.ee=JavaSE)(版本=1.8))"