【问题标题】:Apache servicemix OSGi bundle fails to import packagesApache servicemix OSGi 包无法导入包
【发布时间】:2018-12-28 11:43:32
【问题描述】:

我还不是经验丰富的 OSGi 用户,因此我遇到了一些问题。

我正在尝试使用 org.apache.servicemix.bundles.hadoop-client 作为外部 hadoop 提供程序,因为我不希望我的包包含所有这些类。

但是当我运行这组捆绑包(我的和org.apache.servicemix.bundles.hadoop-client)时,我收到以下错误:

错误:捆绑 org.apache.servicemix.bundles.hadoop-client [56] 错误启动文件:bundles/org.apache.servicemix.bundles.hadoop-client_2.8.1.1.jar (org.osgi.framework. BundleException:无法解析 org.apache.servicemix.bundles.hadoop-client [56](R 56.0):缺少要求 [org.apache.servicemix.bundles.hadoop-client [56](R 56.0)] osgi.wiring。包;(&(osgi.wiring.package=corg.osgi.framework.BundleException:无法解析 org.apache.servicemix.bundles.hadoop-client [56](R 56.0):缺少 requiremom.google.inject)(版本>=3.0.0)(!(version>=4.0.0))) 未解决的要求:[[org.apache.servicemix.bundles.hadoop-client [56ent [org.apache.servicemix.bundles.hadoop-client [56 ](R 56.0)] osgi.wiring.package; (&(osgi.wiring.package=com.google.inject)(ve](R 56.0)] osgi.wiring.package; (&(osgi.wiring.package= com.google.inject)(版本>=3.0.0)(!(版本>=4.0.0)))]) rsion>=3.0.0)(!(version>=4.0.0))) 未解决的要求:[[org.apache.servicemix.bundles.hadoop-client [56](R 56.0)] osgi.wiring.package; (&(osgi.wiring.package=com.google.inject)(version>=3.0.0)(!(version>=4.0.0)))] 在 org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111) 在 org.apache.felix.framework.Felix.startBundle(Felix.java:2117) 在 org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371) 在 org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308) 在 java.lang.Thread.run(Thread.java:748)

我了解 org.apache.servicemix.bundles.hadoop-client 导入 com.google.inject 并希望其他一些捆绑包导出它。

我自己的包也导入了com.google.inject,并且可以正常工作。唯一的区别是我的包使用版本3.0hadoop 想要4.0

com.google.inject 3.04.0 包都在 osgi_container/bundles 文件夹中。

我什至试图将我的捆绑包强制为 <export-package> com.google.inject 并且它“有效”。错误开始要求另一个库。 </stupid attemtps>

所以我被困在了这一点上。感谢您的建议。

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    上面异常的核心是这个

    (&(osgi.wiring.package=com.google.inject)(version>=3.0.0)(!(version>=4.0.0)))
    

    这意味着 hadoop-client 需要一个包,该包以版本 [3.0.0,4.0.0) 导出包 com.google.inject。这意味着从 3.0.0 到不包括 4.0.0 的所有包版本都应该是有效的。

    正如 PanzOr 的评论中提到的,google guice 似乎以不同的版本导出了包 com.google.inject。最新的 guice 导出版本 1.4。所以看起来hadoop客户端包可能被破坏了。因为它的导入范围使用的是包版本而不是实际的包版本。

    顺便说一句。我放弃了在 OSGi 中安装任何大数据项目。它们似乎都有大量非 OSGi 依赖的巨大依赖树。所以它们真的很难安装。

    【讨论】:

    • 谢谢,但是除了捆绑包com.google.inject.3.0 必须包含在捆绑包文件夹中(因为它是)之外,您还有其他要点吗:(
    • 顺便说一句,com.google.injectBundle-Version: 3.0.0Export-Package: .. ,com.google.inject;version="1.3"
    • 哦 .. 感谢您发现这一点。我希望谷歌注入包导出带有包版本的包。似乎他们实际上是在做语义版本控制。在这种情况下,我想知道 hadoop-client 的导入是否可能被破坏。
    猜你喜欢
    • 2018-04-17
    • 2014-12-01
    • 2016-01-25
    • 2012-10-11
    • 2014-01-12
    • 2012-04-04
    • 2015-10-19
    • 2011-05-21
    • 2018-03-20
    相关资源
    最近更新 更多