【问题标题】:Java package versions - getting it rightJava 包版本——正确使用
【发布时间】: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


【解决方案1】:

我在程序和包含扩展它的类的 jar 中找不到任何实现 SomeInterface 的类的原因是因为 SomeInterface 的版本不匹配?

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

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

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

【讨论】:

  • 这不是超级罐子。我用maven打包的,会不会有什么关系?
  • 当然。您没有在其他库中正确列出所需版本的 <dependency> 并且您没有对其进行遮蔽,正如我所说,您在类路径上缺少另一个库,这是外部的到 Maven
【解决方案2】:

看到原始问题已经找到答案,似乎有点相关提到 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

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多