【发布时间】:2017-09-08 07:03:07
【问题描述】:
我想更深入地了解 Java 如何处理不同版本的类/包/等,但找不到任何资源或至少是谷歌搜索的最佳方式。问题如下。
假设我们有一些外部包com.external.package,其中包含SomeInterface 的定义。
现在我编写了一个实现SomeInterface 的java 类MyClass,并使用com.external.package v1.0.0。接下来我打包一个包含MyClass 的(精简)jar。
现在我将这个 jar 插入另一个正在寻找 SomeInterface 实现的程序中,但在它的依赖项中,它使用的是 com.external.package v2.0.0。
我得到Failed to find any class that implements SomeInterface 的原因是SomeInterface 的版本在程序和包含扩展它的类的jar 中不匹配吗?
基本上,我想找到答案的问题是 jar 存储了哪些关于外部依赖项的信息?它是否存储了它们的确切版本,如果它们在运行时不匹配它会抱怨?但是为什么它甚至允许运行引用相同依赖项但不同版本的程序呢?
【问题讨论】:
-
Java 没有“包版本控制”的概念
-
您能否在回答我的问题时给出更广泛的解释?
-
类和包没有版本。我们不知道您得到“无法找到任何实现 SomeInterface 的类”的原因,因为我们不知道您的代码在做什么,而且这看起来不像是标准的编译器/运行时错误。所以它必须来自您的代码,或者来自您正在使用的库之一。
-
JAR 也不存储版本信息。一个 Maven/Gradle 配置会,它只是捆绑所有的库。
-
就 Maven 而言,您可以说他们有不同版本的版本。但特别是对于包,Java 没有任何称为版本的东西。您尝试访问的界面可能来自不同的 maven/ build(而不是包)版本。
标签: java versioning