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

时间:2015-02-20 20:19:37

标签: java scala maven jar clojure

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

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

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

  • 克隆依赖关系来源
  • 哈哈
  • 编译
  • 将其发布到某个本地maven / ivy存储库
  • 在项目中集成固定版本

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

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

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

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

编辑:我说的是图书馆内部,不打算由图书馆作者修改。请假设要更改的类是最终的,不能通过库配置替换,也不能以任何方式注入库中。

2 个答案:

答案 0 :(得分:1)

在Clojure中,您可以使用intern重新绑定变量,也可以从其他名称空间重新绑定变量。因此,只要您想要更改的代码是Clojure代码,这就是monkeypatch的可能方式。

(intern 'user 'inc dec)
(inc 1)
=> 0

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

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

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

答案 1 :(得分:1)

我不同意AspectJ难以使用,它或其他字节码操作库是您唯一的现实选择。

加载时间编织是解决此问题的明确方法。根据您使用相关类的方式,您甚至可以使用模拟库来获得相同的结果,但像AspectJ这样专门用于增强和操作的东西可能是最简单的。