【问题标题】:How to deal with two versions of an API如何处理一个 API 的两个版本
【发布时间】:2012-07-03 12:47:45
【问题描述】:

我的问题:什么是处理两个不同版本的 API 的好方法? (子问题:如果你包含两个具有相同类名的库,有什么办法可以避免类路径引用问题?)

问题描述:我有一个使用 API 的项目。在过去的几个月里,我一直在为旧版本进行开发,并且即将为新版本添加功能。据我所知,只有一个关键区别。但是,我还没有 API(等待有人给我拿罐子),所以我不确定是否还有更多差异。

子问题描述:我担心这两个 API 之间可能存在类引用不一致(就像我说的,我还没有确定的 jar)。

我知道您可能希望查看一些代码,但这是一个设计问题,而不是一个编码问题。我希望得到一些最佳实践。谢谢!

不是重复的:我在few 提出了looked 的问题,这些问题可能看起来是重复的,但它们并没有真正解决我的问题:)

【问题讨论】:

  • 我看不出如何将 .NET 答案普遍应用于 Java 问题,您是否尝试搜索实际相关的问题?更好的信息。
  • 你肯定已经知道了..,我们使用maven通过排除旧版本并将新版本包含到类路径来解决依赖冲突。
  • @Rp- 但是 OP 专门询问类路径上的两个库,如果给定类,每个库都有一个实现。显然“不要”是最好的答案。

标签: java api


【解决方案1】:

避免,或遮蔽。

如果您可以完全控制类路径,则可以使用排序:这是脆弱且不直观的。

如果你不这样做,你就会受到任何事物的摆布,因此会出现阴影以及相关的问题。

【讨论】:

  • 对不起,我以前从没听说过阴影,你能帮我填一下吗?
  • @kentcdodds 基本上是重新打包其中一个库,通常作为构建过程的一部分。
  • 我一定很笨,但我不认为我正在执行最好的查询来找到你在说什么。能否给我一些文档的链接:)谢谢。
  • @kentcdodds Your specific problem, sort of(使用jarjar),如果使用Maven,请参见Maven shade plugin
  • 我认为这就是我正在寻找的答案。感谢您的帮助!
【解决方案2】:

您还可以使用类加载器隔离策略。例如,如果您在容器环境(Java EE、OSGi)中,您可以将不同版本的库放在不同的类加载器上下文中(即不同的 EJB jar 或不同的 Web 应用程序),它们不会相互干扰其他。

OSGi 可以做同样的事情;将库 A.1 和 A.2 部署到 OSGi 容器中,并将 project.uno(使用 A.1)和 project.dos(使用 A.2)部署到同一个 JVM 中,OSGi 容器处理类路径。

【讨论】:

  • 当然,OSGi 需要对应用程序进行重组,而 JEE 需要...嗯,JEE,并且您必须确保您在正确的类加载器下。如果不了解更多关于 OP 的环境和退役情况,我很难推荐任何一个作为通用解决方案。
  • 同意。然而,它们都是可能性。
猜你喜欢
  • 2012-01-22
  • 2021-12-23
  • 2012-05-28
  • 2015-01-24
  • 2013-04-11
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多