3

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

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

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

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

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

感谢您对此的任何意见。

4

3 回答 3

2

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

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

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

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

于 2013-11-25T12:02:42.263 回答
1

TL;博士;

访问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>
  • 快速解决方法
  • 做起来很简单
  • 简单撤消
于 2016-09-01T21:16:39.253 回答
1

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

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

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

于 2016-12-04T01:59:00.453 回答