【问题标题】:How to resolve the chain dependency error in karaf?如何解决karaf中的链依赖错误?
【发布时间】:2020-07-02 13:32:09
【问题描述】:

当我尝试启动一个捆绑包时出现以下错误

Chain 1:
  foo.bar.fizz.core.rest.impl [foo.bar.fizz.core.rest.impl [208](R 208.0)]
    import: (&(osgi.wiring.package=javax.annotation)(version>=1.2.0)(!(version>=2.0.0)))
     |
    export: osgi.wiring.package: javax.annotation
  org.apache.felix.framework [org.apache.felix.framework [0](R 0)]

Chain 2:
  foo.bar.fizz.core.rest.impl [foo.bar.fizz.core.rest.impl [208](R 208.0)]
    import: (&(osgi.wiring.package=foo.bar.fizz.cdac.tableobject.api)(version>=8.60.0)(!(version>=9.0.0)))
     |
    export: osgi.wiring.package=foo.bar.fizz.cdac.tableobject.api; uses:=com.google.common.collect
  foo.bar.fizz.cdac.tableobject [foo.bar.fizz.cdac.tableobject [196](R 196.0)]
    import: (&(osgi.wiring.package=com.google.common.collect)(version>=16.0.0)(!(version>=17.0.0)))
     |
    export: osgi.wiring.package=com.google.common.collect; uses:=javax.annotation
  com.google.guava [com.google.guava [29](R 29.0)]
    import: (osgi.wiring.package=javax.annotation)
     |
    export: osgi.wiring.package: javax.annotation
  org.jsr-305 [org.jsr-305 [28](R 28.0)] Unresolved requirements: [[foo.bar.fizz.core.rest.impl [208](R 208.0)] osgi.wiring.package; (&(osgi.wiring.package=foo.bar.fizz.cdac.tableobject.api)(version>=8.60.0)(!(version>=9.0.0)))]

我明白为什么会出现错误(因为一个依赖来自两个流,而 osgi 在这两个流之间存在混淆)。但是,我不知道如何避免这种情况,因为一个流程是“org.apache.felix”,它以 0 开始级别开始,我似乎无法改变它。

这里是捆绑包的更多日志:tree-show


foo.bar.fizz.cdac.tableobject [197]
+- foo.bar.fizz.cdac.api [194]
|  +- foo.cil.cdac.cil-cdac-common-api [133]
|  +- avro [292]
|  |  +- org.xerial.snappy.snappy-java [329]
|  |  +- jackson-core-asl [314]
|  |  +- jackson-mapper-asl [315]
|  |  |  +- jackson-core-asl [314]
|  |  +- org.ops4j.pax.logging.pax-logging-api [6]
|  |  |  +- org.apache.karaf.services.eventadmin [3]
|  |  |     +- org.apache.felix.metatype [2]
|  |  |     +- org.apache.felix.configadmin [9]
|  |  |        +- org.apache.felix.coordinator [8]
|  |  +- org.apache.commons.compress [293]
|  |  |  +- org.tukaani.xz [328]
|  |  +- com.thoughtworks.paranamer [257]
|  |     +- org.glassfish.hk2.external.jakarta.inject [92]
|  +- com.google.gson [252]
|  +- foo.bar.common.datatypes.date [224]
|  |  +- joda-time [287]
|  +- foo.cil.client.service [136]
|  |  +- avro [292]
|  |  +- org.apache.servicemix.bundles.lucene [309]
|  |  +- org.apache.servicemix.bundles.lucene-queryparser [307]
|  |     +- org.apache.servicemix.bundles.lucene [309]
|  |     +- org.apache.servicemix.bundles.lucene-sandbox [308]
|  |     |  +- org.apache.servicemix.bundles.lucene [309]
|  |     |  +- org.apache.servicemix.bundles.jakarta-regexp [303]
|  |     +- org.apache.servicemix.bundles.lucene-queries [306]
|  |        +- org.apache.servicemix.bundles.lucene [309]
|  +- org.ops4j.pax.logging.pax-logging-api [6]
|  +- foo.bar.fizz.businessentity [193]
|     +- foo.bar.common.datatypes.date [224]
+- foo.bar.common.datatypes.date [224]
+- com.fasterxml.jackson.core.jackson-databind [242]
|  +- com.fasterxml.jackson.core.jackson-annotations [238]
|  +- com.fasterxml.jackson.core.jackson-core [240]
+- org.ops4j.pax.logging.pax-logging-api [6]
+- foo.bar.fizz.businessentity [193]
+- com.google.guava [30] <- START LEVEL
   +- org.jsr-305 [29]
   +- org.glassfish.hk2.external.jakarta.inject [92]
karaf@root()>                                                

我尝试了哪些但没有成功?

  • 我尝试将捆绑包列入黑名单,但实际上什么也没发生。
  • 我尝试排除导致此问题的依赖项 (jsr-305),但这也不起作用。
  • 开始级别已更改。

请提出一些可以解决这个问题的方法,或者至少为我指明正确的方向。

【问题讨论】:

    标签: java maven apache-karaf karaf-maven-plugin


    【解决方案1】:

    我选择的解决方案是将我的 osgi 实现从 Felix 更改为 Equinox。

    显然,karaf 默认使用 felix,但您可以使用 custom.properties 文件覆盖它并添加以下行

    目录结构

    assembly
     etc
      custom.properties
    

    文件内容

    karaf.framework=equinox
    

    说明

    Felix 提供了自己的 javax.annotation,我无法排除它,所以我选择了这个解决方案。

    【讨论】:

      【解决方案2】:

      问题是,如果包已经被链 1 中的 felix 框架导出,你真的需要在链 2 中安装 org.jsr-305 吗?

      如果 Equinox 一开始不导出该包,从 Felix 更改为 Equinox 将解决问题,但请注意,Felix 的启动速度也比 Equinox 快得多(多线程解析等)

      【讨论】:

      • 我同意你刚才所说的关于 Felix 的内容,但我就是无法摆脱 jsr。它似乎来自项目的番石榴依赖项。由于某种原因,我无法修改该项目 pom。
      • 另外,我认为,我需要对我的所有依赖项使用排除项,这样我就不会得到这样的惊喜。这样我就可以控制它们,然后可能会切换到 felix。
      • 嗯,如果你卸载 jsr 包,guava 应该没问题,因为 Felix 仍在导出它,每个人都会针对框架的 jsr 包
      • 是的,最好不要在“业务包”上导出任何内容,以避免重新导出导入的 api
      • 我可以向你推荐一本很有帮助的书“osgi in action”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2013-04-29
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多