繁体   English   中英

热修复第三方库依赖项中的错误

[英]Hot-fixing a bug in a third-party library dependency

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

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

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

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

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

感谢您对此的任何投入。

我最终单独构建了项目,然后将此版本移至另一个名称空间。 这显然不是很普遍。 例如,Hibernate将cglib保留在其自己的名称空间中,以避免由于API更改而导致版本冲突。

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

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

即使听起来也很痛苦:即使仅更改几行代码,也必须移出名称空间并提供单独的构建。

TL; DR;

访问https://jitpack.io并阅读其工作原理


解决问题的步骤

假设第三方库在github上,只需克隆项目并修复它。

然后使用https://jitpack.io JitPack从您的存储库(您在其中修复了代码)创建了一个.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>
  • 快速解决
  • 容易做
  • 易于撤消

我认为将项目的依赖项移至自定义名称空间并不是最佳选择,原因有以下几个:

  • 您所做的修改可能不会发送回依赖项的原始开发者。
  • 很难跟上新的依赖版本,因此不再有第三方开发人员和贡献者提供的错误修正,新功能以及漏洞修复。
  • and the custom namespaced dependency got modified. 我的经验是,随着时间的流逝, 以及修改自定义命名空间的依赖关系会被遗忘。 这将导致该项目的这一部分不仅被弃用,而且不可触摸,因为没有人会知道替换它会破坏什么。

我同意使用Jitpack的工作流程是最好的解决方案。 我写了一篇博客文章,其中包含详细的指导,仅需花费几分钟时间即可做到: https//5am.technology/2016/12/fix-bugs-third-party-dependency-jitpack/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM