2017-09-08 83 views
1

我想深入了解Java如何处理Classes/Packages /等的不同版本,但无法找到任何资源或至少是Google的最佳方式。问题如下。Java包版本 - 正确解决问题

想象一下,我们有一些外部包com.external.package,其中包含SomeInterface的定义。

现在我写一个java类MyClass,它实现了SomeInterface,并使用com.external.package v1.0.0。接下来我打包一个包含MyClass的(精益)罐子。

现在我将此jar插入另一个程序中,该程序正在寻找SomeInterface的实现,但在它的依赖关系中,它使用的是com.external.package v2.0.0

是我得到的原因Failed to find any class that implements SomeInterfaceSomeInterface的版本在程序和包含扩展它的类的jar中不匹配?

基本上我想找到一个答案的问题是什么信息做瓶子存储关于外部依赖关系?它是否存储了它们的确切版本,如果它们在运行时不匹配,它会抱怨?但为什么它甚至允许运行引用相同的依赖项,但不同版本的程序?

+1

Java的东西有没有“包版本” –

+0

的概念,您能给一个更广泛的解释回答我的问题? – eddyP23

+0

类和包没有版本。你得到这个“无法找到任何实现SomeInterface的类”的原因对我们来说是未知的,因为我们不知道你的代码在做什么,这看起来不像标准的编译器/运行时错误。所以它必须来自您的代码或来自您正在使用的库之一。 –

回答

2

的原因是我得到无法找到实现SomeInterface该SomeInterface的版本不会在程序和包含其扩展一个类的jar匹配任何类别的?

这里没有“版本控制”发生。简单地说,错误状态表明类路径中不存在这样的类。例如,您没有在您的java命令中添加-cp来添加该额外的JAR /类文件。

这可能发生的其他原因是API将某个类标记为v1中已弃用的类,然后决定将其从v2中删除。在这种情况下,在打包自己的代码之前,最好尝试针对正确的库版本编译和测试代码。如果你制作了一个超级JAR,那么这些类应该被遮蔽,并且你可能不会缺少类。

Maven项目确实有传递性,版本依赖的概念,但你不能说有关

+0

它不是一个超级罐子。我用maven来打包它,可能与它有什么关系? – eddyP23

+0

当然。您没有正确地列出某个其他库上的''以获得所需的版本,并且您没有对其进行遮蔽**或**,您错过了类路径上的其他库,正如我所说的,这对Maven来说是外部的 –