【问题标题】:Hot-fixing a bug in a third-party library dependency热修复第三方库依赖中的错误
【发布时间】:2013-11-19 20:04:12
【问题描述】:

我在我正在使用的一个更大的应用程序框架中发现了一个小错误。修复只需要更改单个类中的两行。我修复了问题并将更改推送到项目的存储库。

但是,我需要明天发布。因此,我不能等到图书馆发布新版本。我想知道将补丁版本集成到我的项目中的最佳方法是什么:

  • 构建项目:我觉得这很困难,我什至无法正确构建它,因为快照存储库中有太多单元测试被破坏,即使没有单元测试,我也没有走得太远,因为我显然错过了一些在 Maven Central 中找不到的依赖项。另外,我需要将固定版本发送给所有其他开发人员,因为在 Maven Central 上找不到它。 (我们在网络上工作,我们没有自己的 Nexus。)

  • 在我的项目中添加一个新模块,我在其中保留了已修复的类的副本。然后,我将此模块作为依赖项添加到所有应该使用该类的覆盖版本的模块。但是 JVM 是如何确定它实际加载的类的呢?它将找到两个包含同名类的 jar 文件。它将实际加载哪一个?如果我可以完成这项工作,这将允许我将修改后的类版本与我的项目集成,这样我就可以将补丁与项目一起分发,一旦错误得到修复,我就可以简单地删除模块。

  • 我将修改后的类文件包含到受影响的模块本身中。到目前为止,这对我来说似乎是最简单的解决方案,因为 JVM 总是首先从同一个 jar 加载类。 (我说的对吗?至少这是我在测试中观察到的。)

感谢您对此的任何意见。

【问题讨论】:

  • 您提到您无法构建最新的快照。您是否尝试过构建最新的稳定版本,可能来自分支/标签?
  • 不,这实际上是一个更好的选择。但是这个解决方案的其他问题仍然存在。

标签: java maven release hotfix


【解决方案1】:

TL;DR;

访问 https://jitpack.io 并了解其工作原理


解决问题的步骤

假设第三方库在github,直接克隆项目,修复即可。

然后使用https://jitpack.io。 JitPack 从你的 repo(你修复代码的地方)创建一个 .jar 并为你生成一个依赖项

<dependency>
    <groupId>GITHUB_USER</groupId>
    <artifactId>REPOSITORY</artifactId>
    <version>COMMIT</version>
</dependency>

您还需要显式添加此远程存储库

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
  • 快速解决方法
  • 简单易做
  • 简单撤消

【讨论】:

    【解决方案2】:

    我认为将项目的依赖项移动到自定义命名空间不是最佳选择,原因如下:

    • 您的修改可能不会发送回依赖项的原始开发人员。
    • 很难跟上新的依赖版本,因此没有更多的错误修复,没有新功能,也没有来自第三方开发人员和贡献者的漏洞修复。
    • 我的经验是,随着时间的推移,它会忘记 如何为什么 自定义命名空间依赖项被修改。这将导致项目的这一部分不仅被弃用,而且无法触及,因为没有人知道替换它时会出现什么问题。

    我同意使用 Jitpack 的工作流程是最佳解决方案。我写了一篇博客文章,其中包含详细的指南,只需几分钟的开销:https://5am.technology/2016/12/fix-bugs-third-party-dependency-jitpack/

    【讨论】:

      【解决方案3】:

      我最终单独构建项目并将这个版本移动到另一个命名空间。这显然并不少见。例如,Hibernate 将 cglib 保留在自己的命名空间中,以避免由于 API 更改而导致版本冲突。

      • 当我使用的项目也在另一个依赖项中使用时,第一个建议的解决方案出现问题,导致我的修改版本和 正常 版本都在类路径上导致由于命名冲突导致非常奇怪的行为。

      • 第二个和第三个建议与第一个建议有类似的问题。此外,我破坏了与其他版本的依赖项的兼容性。

      即使听起来很痛苦:离开命名空间并提供单独的构建是必须的,即使您只更改几行代码。

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多