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 中,通过添加 org.slf4j.*,我们解决了同样的问题。

【讨论】:

【参考方案4】:

provided 添加到 POM 中的依赖项。 阅读http://fusesource.com/docs/ide/7.1/release_notes/release_notes.html

【讨论】:

那有什么帮助? provided 依赖关系仍然包含在 maven-bundle-plugin 的依赖关系计算中。

以上是关于OSGI 缺少需求错误的主要内容,如果未能解决你的问题,请参考以下文章

启动捆绑包时缺少要求 osgi.wiring.package

无法启动 OSGi 包,缺少 com.ibm.uvm.tools

OSGi Capabilities

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))"