2011-03-02 59 views
1

我有我有行家以下循环依赖的情况下:如何在maven中排除循环弃用的依赖关系而不会完全依赖关系?

JAR A version 1.1 depends on JAR B version 1.0 
JAR B version 1.1 depends on JAR A version 1.0 

出于某种原因,我不知道,Maven的把所有的4个JAR文件:一个1.0,一个1.1,B 1.0和B 1.1,这会导致类路径冲突。

这真的很糟糕。我已经要求两个JAR的开发者来解决这个问题,但是我不能简单地坐着等待他们决定修复这个问题的那一天。

我尝试这样做:

<dependency> 
    <groupId>groupA</groupId> 
    <artifactId>artifactA</artifactId> 
    <version>1.1</version> 
    <type>pom</type> 
    <scope>compile</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>groupB</groupId> 
      <artifactId>artifactB</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>groupB</groupId> 
    <artifactId>artifactB</artifactId> 
    <version>1.1</version> 
    <type>pom</type> 
    <scope>compile</scope> 
    <exclusions> 
     <exclusion> 
      <groupId>groupA</groupId> 
      <artifactId>artifactA</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

结果是行家排除所有的JAR文件,就好像没有依赖关系,并将该项目不编译因为有遗漏的类。

因此,除了要求两个JAR开发人员解决此问题外,我该怎么办?如何导入两个新的依赖项,同时忽略两个旧的依赖项?

回答

1

务实的解决方案将是重新声明作为提供的不需要的依赖关系,例如:

<dependency> 
    <groupId>groupA</groupId> 
    <artifactId>artifactA</artifactId> 
    <version>1.0</version> 
    <scope>provided</scope> 
</dependency> 

我不特别喜欢以这样的方式使用所提供的,因为它的叶子在编译时的依赖性,并可能导致不必要的编译依赖性,但我没有看到你的情况;(

+0

这是我在实践中做的 – DaShaun 2011-03-03 15:22:57

+0

我可以声明两个版本的相同依赖项插入到类路径中吗 – 2011-03-06 15:28:38

+0

否,据我所知,maven对此感到灰心 - 而且在实践中你不应该这样做,因为上课会犯规无论如何(最有可能按字母顺序),从第一次遇到的依赖关系(jar文件)加载,所以你不会从中受益。 – 2011-03-08 10:41:34