使用OSGI/Maven管理多个依赖版本



我有一个为我正在进行的OSGI项目构建的Maven。我想使用谷歌的guava OSGI库11.0.1版中的一些功能。

我所依赖的一个项目依赖于guava osgi 10.0.0版本。我知道为一个特定的依赖拥有多个版本是可行的,但我在这方面有点麻烦

在我的项目pom中指定对11.0.1的依赖关系编译得很好,但当我运行单元测试时,Java会引入10.0.0版本,这会导致运行时错误。具体来说,11.0.1中的一个类与10.0.0中的接口同名,所以当我尝试实例化它时,Java barfs

有没有一种方法可以优雅地做到这一点?

  1. 使用maven依赖插件检查依赖树:mvn dependency:tree
  2. 使用guava-osgi:10.0.0版本查找测试范围中活动的所有依赖项
  3. 从测试范围中排除guava-osgi:10.0.0
...
<dependency>
    <groupId>dep1-groupid</groupId>
    <artifactId>dep1-artifactid</artifactId>
    <version>dep1-version</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>com.googlecode.guava-osgi</groupId>
            <artifactId>guava-osgi</artifactId>
        </exclusion>
    </exclusions>
</dependency>
...

您可以尝试从"我依赖的项目"中排除10.0.0版本

...
<dependency>
    <groupId>project i depend on</groupId>
    <artifactId>project</artifactId>
    <version>2.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.googlecode.guava-osgi</groupId>
            <artifactId>guava-osgi</artifactId>
        </exclusion>
    </exclusions>
</dependency>
...

由于您在基于OSGi的环境中工作,因此可以使用bundle插件轻松地指定所需的guava版本。但是,重要的是要理解,在编译时和单元测试时(即在Maven中),它并不知道/关心您创建的OSGi环境。所以,你必须使用其他答案中提到的一些技巧。不过我还没有测试过。

最新更新