2014-01-14 54 views
0

我使用两个罐子A和B. B是一个库,A有类库,它使用库B中的一些旧类。现在,当我将两个罐子包含在我的项目类路径中时,这会导致我出现问题,因为它们都是相同的两个班的名字,但其中一个比另一个老,行为不同。用maven解决jar地狱?

我发现这个问题的一个解决方案是首先将库B导入到Eclipse中,然后单击确定并且构建项目。然后我添加jar A.这样,我现有的所有代码都将使用B的新版本,并且A的类将不变。

但是现在我想为我的项目使用Maven,但我无法知道如何使用Maven再次制作这个技巧。请帮忙。

+0

没有'jar地狱'与maven :)但你的旧配置像'jar地狱'解决方案臭。 – MariuszS

+1

@MariuszS好吧,但它是一种更好的地狱。 –

+0

它在哪里? :)有了maven,只有一个罐子可能。 – MariuszS

回答

0

问题是非常真实的(除非我)。 如果您检测到存在冲突的库,则可以使用exclusions来防止您不需要的导入库。 如果你不知道什么是冲突的库,在eclipse中使用默认的maven插件,你可以打开pom文件,并选择右栏中的“依赖层次结构”选项卡,你可以看到你项目的所有已解决的依赖关系,留下什么库导入每个依赖项。

我希望它能帮助你。

+1

这是关于类冲突,而不是依赖冲突。 Eclipse剂量从jar读取依赖关系。 – MariuszS

3

也许你可以通过重新命名你不想要的类的包来解决你的问题。

您可以通过使用Maven Shade Plugin

做这个插件允许在编译重命名包名。

用法:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
      </goals> 
     <configuration> 
       <relocations> 
        <relocation> 
          <pattern>com.example.package.name.YourClass</pattern> 
           <shadedPattern>com.example.rename.package.name.YourClass</shadedPattern> 
        </relocation> 
       </relocations> 
        <promoteTransitiveDependencies>true</promoteTransitiveDependencies> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 
1

这不一定是一个Maven问题。默认的类加载器将根据类路径上的jar的顺序来搜索类。当你将jar添加到Eclipse中时,你会这样做,它们的顺序会确保加载正确的类 - 具体来说B在A之前出现在类路径中,因此,当同一个类在两个jar中时,它将被加载来自B.

从Maven 2.0.9版开始,类路径是根据POM中依赖关系的顺序构建的。所以,提供依赖关系B在依赖关系A之前声明,你应该得到和Eclipse一样的行为。

不用说,以这种方式依靠类路径顺序是相当脆弱的,我个人认为如果可能的话清理罐子。

+0

清理瓶子是不可能的 –

+0

然后确保在pom中有非常明确的注释,表明依赖关系的顺序很重要,以防万一有人觉得在整个过程中进行整理和重新排序。 –