我正在使用两个罐A和B. B是一个库,A有一些类使用库B中的一些旧类。现在,当我在项目类路径中包含两个jar时,这会导致我出现问题,因为两个类的相同名称,但其中一个比另一个更旧,行为不同。
我发现这个问题的一个解决方案是首先将库B导入Eclipse,然后单击OK然后构建项目。然后我添加了jar A.这样我所有现有的代码都将使用较新版本的B,A的类将不受影响。
但是现在我想将Maven用于我的项目,但我不知道如何使用Maven再次使用Maven。请帮忙。
答案 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”选项卡,您可以看到项目的所有已解析的依赖项,并在左侧什么库导入每个依赖项。
我希望它可以帮到你。