Java 处理重复的完全限定名

Java 处理重复的完全限定名,java,import,jar,dependencies,fully-qualified-naming,Java,Import,Jar,Dependencies,Fully Qualified Naming,正如标题所说,有办法解决这个问题吗?我导入了两个独立的第三方库,它们有完全限定的类名冲突 现在这两个库都是以jar形式导入的,在某些环境(命令行调用,Eclipse)中找到了正确的类,而在其他环境(Maven)中找到了错误的类,我得到了一个缺少方法的异常。如果找不到解决方案,我可以回过头来重新分解其中一个库并重建jar,但我不希望每次库有更新时都重复这项工作 编辑:如果有人后来看到这一点并感到困惑,我接受了Dave Newton的答案,因为如果您在编写所有代码之前足够勤奋地抓住这个问题,这将是正

正如标题所说,有办法解决这个问题吗?我导入了两个独立的第三方库,它们有完全限定的类名冲突

现在这两个库都是以jar形式导入的,在某些环境(命令行调用,Eclipse)中找到了正确的类,而在其他环境(Maven)中找到了错误的类,我得到了一个缺少方法的异常。如果找不到解决方案,我可以回过头来重新分解其中一个库并重建jar,但我不希望每次库有更新时都重复这项工作


编辑:如果有人后来看到这一点并感到困惑,我接受了Dave Newton的答案,因为如果您在编写所有代码之前足够勤奋地抓住这个问题,这将是正确的方法。正如我所怀疑的那样,在编写完所有代码后自动修复导入似乎是不可能的。

您可以对其进行着色、分割并移除副本,或者

当您有多个实现时,您将任由类加载器摆布,除非您采取主动步骤来减轻重复


进一步讨论请访问。

这是两个不同的库?同一班?它们是什么库和类?org.openstreetmap.core.database.DatabaseLoginCredentials。它既存在于核心的开放街道地图库中,也存在于名为“旅行推销员”的子项目的库中。他们有点不同。我读了你的另一个答案,这看起来是一个有趣的想法,但我在一个关键点上迷失了方向。现在我有一些看起来像import foo.bar.baz的导入;这是不明确的,因为该类位于两个单独的jar中。如果我让它重新打包并重命名一个jar,那么代码如何知道它需要查看旧jar还是新jar?@AlexN。请记住,
import
语句只是一种语法上的便利:在字节码中,类总是完全限定的。当您着色时,您的“导入”将更新(如果您正在着色)为新名称,以及正在着色的着色包。从您的角度来看,它不是“在一个或另一个jar中查找”,而是“在类路径上查找完全限定的类”,而不管其位置如何。是的,但我仍然不理解它如何可能知道如何更新类。即使我每次都要写出完全合格的课程,它怎么能分辨出我最初指的是哪门课程?我是否需要生成dependency-reduced-pom.xml,然后编辑代码以匹配它?实际上,我试图将shade插件添加到Maven中,它生成了jar和新pom,但没有正确更新类路径。@AlexN。“没有正确更新类路径”是什么意思?依赖关系决定了哪些“块”需要哪些JAR。如果需要,可以从Maven
中排除依赖项。Hmmm。我似乎很难用这个词来表达。如果当前源具有导入相同类的导入,那么如何在每次提到时分辨出我想要哪个类?事实上,我已经读够了,我认为这是不可能自动完成的,这正是我所害怕的。谢谢你的帮助。