用maven解决一个罐子地狱?

时间:2014-01-14 08:33:21

标签: java eclipse maven jar

我正在使用两个罐A和B. B是一个库,A有一些类使用库B中的一些旧类。现在,当我在项目类路径中包含两个jar时,这会导致我出现问题,因为两个类的相同名称,但其中一个比另一个更旧,行为不同。

我发现这个问题的一个解决方案是首先将库B导入Eclipse,然后单击OK然后构建项目。然后我添加了jar A.这样我所有现有的代码都将使用较新版本的B,A的类将不受影响。

但是现在我想将Maven用于我的项目,但我不知道如何使用Maven再次使用Maven。请帮忙。

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

从Maven 2.0.9版开始,类路径是根据POM中依赖项的顺序构建的。因此,在依赖关系A之前声明依赖关系B,你应该得到与Eclipse相同的行为。

毋庸置疑,以这种方式依赖类路径顺序是相当脆弱的,如果可能的话,我个人希望清理罐子。

答案 2 :(得分:0)

问题非常真实(除非对我而言)。 如果您已检测到哪些库存在冲突,则可以使用exclusions来阻止您不想要的导入库。 如果您不知道冲突库是什么,在eclipse中使用默认的maven插件,您可以打开pom文件并在右栏中选择“Dependency Hierarchy”选项卡,您可以看到项目的所有已解析的依赖项,并在左侧什么库导入每个依赖项。

我希望它可以帮到你。