在karaf中解决依赖关系链

时间:2016-10-17 09:20:36

标签: java dependencies osgi guava karaf

我有捆绑A依赖于番石榴版本18和捆绑B,它依赖于捆绑A加上番石榴版本19提供的服务。我已经部署了番石榴版18和19捆。

当我启动bundle B时,我面对guava库的依赖链问题,因为它们有两个路径可供使用?

Chain - 1

捆绑B - >捆绑A-> guava concurrency util v18(bundle A的依赖)

Chain - 2

捆绑B - > guava concurrency util v19(来自bundle)

虽然我已经在pom.xml中的bundle B依赖中提到了依赖版本为guava 19,但为什么这与来自bundle A依赖的guava 18混淆。我如何强制它来忽略捆绑A中的番石榴只是加载版本19?

karaf@root()> restart 239
Error executing command: Error restarting bundles:
           Unable to start bundle 239: Uses constraint violation. Unable to resolve resource com.sample.ngemf.fpm.pm.retImpl [com.sample.ngemf.fpm.pm.retImpl [239](R 239.11)] because it is exposed to package 'com.google.common.util.concurrent' from resources com.google.guava [com.google.guava [252](R 252.0)] and com.google.guava [com.google.guava [62](R 62.0)] via two dependency chains.

Chain 1:
  com.sample.ngemf.fpm.pm.retImpl [com.sample.ngemf.fpm.pm.retImpl [239](R 239.11)]
import: (&(osgi.wiring.package=com.google.common.util.concurrent)(version>=19.0.0)(!(version>=20.0.0)))
 |
export: osgi.wiring.package: com.google.common.util.concurrent
  com.google.guava [com.google.guava [252](R 252.0)]

Chain 2:
 com.sample.ngemf.fpm.pm.retImpl [com.sample.ngemf.fpm.pm.retImpl [239](R 239.11)]
    import: (&(osgi.wiring.package=com.sample.sdn.southbound.common.api)(version>=4.1.0)(!(version>=5.0.0)))
 |
export: osgi.wiring.package=com.sample.sdn.southbound.common.api; uses:=com.sample.sdn.southbound.tl1.api
  com.sample.sdn.southbound.common.api [com.sample.sdn.southbound.common.api [187](R 187.0)]
import: (&(osgi.wiring.package=com.sample.sdn.southbound.tl1.api)(version>=4.1.0)(!(version>=5.0.0)))
 |
export: osgi.wiring.package=com.sample.sdn.southbound.tl1.api; uses:=com.google.common.util.concurrent
  com.sample.sdn.southbound.tl1.api [com.sample.sdn.southbound.tl1.api [194](R 194.0)]
import: (&(osgi.wiring.package=com.google.common.util.concurrent)(version>=18.0.0)(!(version>=19.0.0)))
 |
export: osgi.wiring.package: com.google.common.util.concurrent
  com.google.guava [com.google.guava [62](R 62.0)] Unresolved requirements: [[com.sample.ngemf.fpm.pm.retImpl [239](R 239.11)] osgi.wiring.package; (&(osgi.wiring.package=com.sample.sdn.southbound.common.api)(version>=4.1.0)(!(version>=5.0.0)))]

bundle B中定义中的依赖xml。

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
    </dependency>
    <!-- this is the bundle a dependency which has guava 18 in it -->
    <dependency>
        <groupId>com.sample.sdn.southbound</groupId>
        <artifactId>southbound-common-api</artifactId>
        <version>${package.version}</version>
    </dependency>

2 个答案:

答案 0 :(得分:0)

将番石榴的版本添加到您的pom的dependendyManagement部分。然后每个其他版本的番石榴都被这个替换。

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

答案 1 :(得分:0)

尝试仅安装一个(较新的)番石榴库。据我所知,番石榴不是非常友好的OSGi。因此,将它安装在两个版本中很可能会失败。