【问题标题】:OSGi missing requirement org.wiring.package = org.hsqldb when deploying Camel code to ServiceMix ( FuseESB )将 Camel 代码部署到 ServiceMix ( FuseESB ) 时,OSGi 缺少要求 org.wiring.package = org.hsqldb
【发布时间】:2013-01-31 09:21:08
【问题描述】:

我已经编写了一些 Camel 代码,但是在 Windows 上部署到 FuseESB v7.10 时,我在日志中收到以下异常:

Unable to resolve 337.0: missing requirement [337.0] 
osgi.wiring.package; (&(osgi.wiring.package=org.hsqldb)(version>=1.8.0.7)  
(!(version>=2.0.0))) at   
org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4054)

该项目是使用 Blueprint OSGi xml 文件编写来定义 bean,然后使用 Maven 构建的,作为 jar(而不是 OSGi 包),然后热部署到部署目录,因此它由 FuseESB 部署FAB 部署程序。它在 Maven POM 中对 HSQLDB 没有显式依赖,所以我假设这是一个传递依赖。但是,我尝试安装我认为相关的捆绑包:

osgi:install mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.hsqldb/1.8.0.10_2

此捆绑包现在在 Karaf 控制台中显示为活动:

[335] [Active] [ ] [ ] [ 60] Apache ServiceMix :: Bundles :: hsqldb (1.8.0.10_2)

如果我运行命令 packages:exports 似乎表明此捆绑包导出了正确的依赖项:

FuseESB:karaf@root> packages:exports 335
ID Packages
335 org.hsqldb.resources; version=1.8.0.10
335 org.hsqldb.types; version=1.8.0.10
335 org.hsqldb.jdbc; version=1.8.0.10
335 org.hsqldb.scriptio; version=1.8.0.10
335 org.hsqldb.rowio; version=1.8.0.10
335 org.hsqldb.store; version=1.8.0.10
335 org.hsqldb.index; version=1.8.0.10
335 org.hsqldb.persist; version=1.8.0.10
335 org.hsqldb.lib.java; version=1.8.0.10
335 org.hsqldb.util.sqltool; version=1.8.0.10
335 org.hsqldb; version=1.8.0.10
335 org.hsqldb.sample; version=1.8.0.10
335 org.hsqldb.util; version=1.8.0.10
335 org.hsqldb.lib; version=1.8.0.10

但是我的包仍然无法启动,并给出了同样的错误。有什么想法吗?

【问题讨论】:

  • “但是我的包仍然无法启动。”
  • 这是同样的错误信息,这表明我可能没有安装正确的包?
  • 好的,所以检查丢失的包org.hsqldb是否由您安装的包导出:inspect cap osgi.wiring.package 335
  • 我不确定 ServiceMix 上是否提供了检查帽,所以我给出了 packages:exports 命令的输出,希望能显示适当的信息?
  • 您是否启动了 Derby 捆绑包?

标签: osgi apache-servicemix blueprint-osgi fuseesb


【解决方案1】:

好的,我明白了问题:这是对版本的误解。

您安装的 HSQLDB 包正在将包 org.hsqldb 导出为版本 1.8.0.10。您的捆绑包至少需要 1.8.0.7 版本。您可能认为这不是问题,但实际上 1.8.0.10 小于 1.8.0.7!!

OSGi 版本具有三个数字段(主要、次要、微型)和一个称为限定符的字母数字段。这里,限定符分别是“10”和“7”。当作为字母数字字符串进行比较时,“10”小于“7”,因为“10”的第一个字符是 1,并且在 7 之前。作为参考,使用标准 Java 库中的 String.compare() 方法比较限定符,所以请参阅该方法的 JavaDocs 以获得对该算法的完整描述。

如何解决这个问题?好吧,您的捆绑包 337(无论它是什么)离它所需的版本太远了,太具体了。它可能应该导入 1.8 以上的任何内容,如下所示:[1.8,2.0)... 或者甚至是版本 1 以上的任何内容:[1, 2)

另外,我认为 HSQLDB 的作者在限定符段中使用看起来像数字的东西时犯了一个错误。但是,除非您自己是 HSQLDB 的作者,否则我认为您对此无能为力。

【讨论】:

  • 在这种情况下,将依赖项添加为 maven pom 中的显式依赖项似乎可以解决问题,但感谢您提供有关版本号的信息。
【解决方案2】:

您可以将 HSQLDB 作为依赖项添加到您的 pom.xml 文件中的项目中。然后 FAB 应该自动安装它并将其包含在类路径空间中。

如果你想预先安装它,或者使用共享包,那么你可以将范围定义为

<scope>provided</scope>

然后 FAB 将使用共享包。你可以在这里阅读:http://fuse.fusesource.org/bundle/overview.html

还有一个与即将推出的 Camel 2.11 相关的新 SQL 示例:http://camel.apache.org/sql-example.html。它也适用于 OSGi,因为我们在示例中包含了 features.xml 文件:https://svn.apache.org/repos/asf/camel/trunk/examples/camel-example-sql/

尽管由于通常的 OSGi 痛苦,我们不得不在 felix-bundle-plugin 中添加动态导入:(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 2013-10-28
    • 2016-02-18
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多