Java 包版本 - 正确处理

Java package versions - getting it right

我想更深入地了解 Java 如何处理 Classes/Packages/etc 的不同版本,但找不到任何资源或至少找不到 google 的最佳方法为了它。问题如下

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

现在我写了一个 java class MyClass 来实现 SomeInterface,并使用 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 的版本在程序和包含 class 扩展的 jar 中不匹配吗?

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

Is the reason I get Failed to find any class that implements SomeInterface that versions of SomeInterface don't match in the program and in the jar that contains a class extending it?

这里没有 "versioning" 发生。简单地说,错误表明 class 路径上不存在这样的 class。例如,您没有在 java 命令中放置 -cp 来添加额外的 JAR/class 文件。

发生这种情况的其他原因是 API 将 class 标记为在 v1 中已弃用,然后决定将其从 v2 中删除。在这种情况下,您最好在打包自己的代码之前尝试针对正确的库版本编译和测试您的代码。如果你制作了一个超级 JAR,classes 应该有阴影,你可能不会丢失 classes。

Maven 项目确实有可传递的、版本化的依赖项的概念,但你什么也没说

看到原来的问题已经找到了答案,提到 Java 包和 JAR 可用于指定包版本信息似乎有点相关,如以下文档中所述: https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp89936

此外,Oracle Java 教程讨论了它们以及有关将程序​​部署为 JAR 文件的更多概念,如下所述: https://docs.oracle.com/javase/tutorial/deployment/jar/index.html