JVM:改变依赖库代码的最简单方法?

Seb*_*ber 5 java scala jar clojure maven

大多数时候,我不喜欢Javascript,更喜欢严格的编译语言,如Scala,Java,Haskell ......

但是,使用Javascript可以很好的一件事是能够轻松更改外部依赖项的代码.例如,如果你有一个bug并且你认为它是你的依赖库之一,你可以轻松地通过你自己的覆盖来交换库方法并检查它是否更好.你甚至可以为Array ou String原型和类似的东西添加方法...... node_modules如果他愿意的话,甚至可以暂时去改变库代码.

在JVM世界中,这对我来说似乎是一个繁重的过程:

  • 克隆依赖关系源
  • 劈开它
  • 编译它
  • 将其发布到一些本地maven/ivy存储库
  • 在项目中集成固定版本

这是一种痛苦,我只是不想在一年内多做一次今天我试图修复我的应用程序中的错误,并且lib没有提供足够的信息.我本来希望能够将一个Logger放在该lib的一行上,以便更好地了解发生了什么,但我试图破解调试器但没有成功(无论如何,这个bug在我的计算机上无法再现... .)

是否有任何简单的替代方法可以快速更改依赖项的代码?

我会对Scala,Java,Clojure或任何其他JVM语言的任何解决方案感兴趣.

我不是在寻找可生产部署的解决方案,只是一种在本地使用并最终可在测试环境中部署的快速解决方案.

编辑:我在谈论库内部,不打算由库作者修改.请假设要更改的类是最终的,不能由库配置替换,也不能以任何方式注入库中.

Nie*_*lsK 1

在 Clojure 中,您可以使用intern. 因此,只要您想要更改的代码是 Clojure 代码,这就是猴子补丁的一种可能方法。

(intern 'user 'inc dec)
(inc 1)
=> 0
Run Code Online (Sandbox Code Playgroud)

但这并不是一件容易做的事情,因为它可能并且将会导致其他不期望这种行为的代码出现问题。在开发过程中可以方便地使用它来临时修复其他库中的边缘情况或错误,但不要在已发布的库或生产代码中使用它。

最好简单地分叉并修复这些库,然后发送拉取请求以将其修复在原始库中。

当您自己编写一个库并希望人们需要扩展或重载时,请在 Clojure 协议中实现它,其中这些更改只能限制为扩展/重载名称空间。