我有一个为我正在进行的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
有没有一种方法可以优雅地做到这一点?
- 使用maven依赖插件检查依赖树:
mvn dependency:tree
- 使用
guava-osgi:10.0.0
版本查找测试范围中活动的所有依赖项 - 从测试范围中排除
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环境。所以,你必须使用其他答案中提到的一些技巧。不过我还没有测试过。