用于热类重载的各种Java插件之间有什么区别?哪一个插件最直观



我目前正试图在Java应用程序中实现热类重载,但有太多插件可供选择,我无法在选项之间找到良好的比较。此外,插件的网站也不太清楚的确切功能是什么以及如何使用它们。

还有一个选项是制作自定义热类重载ClassLoader,但我觉得这类似于"重新发明轮子"(如果已经有这么多插件可以完成这项工作的话)。。其他人同意吗?

我发现的Java插件,我认为可以做这项工作:

  • JRebel
  • 动态代码进化虚拟机
  • Fakereplace
  • Apache Commons Java编译器交互(JCI)FileAlterationMonitor(FAM)
  • 代理商史密斯
  • Feenix
  • 播放框架
  • JBoss/WardFly
  • OSGi

那么,有人知道插件之间的差异是什么吗?还有哪个插件是最直观的?

附带说明:我实际想做的是重新加载我的java应用程序的.jar文件依赖项。我有一些java代码,它们经常被自动重新编译,然后转换为.jar文件。这是我的java应用程序的依赖项,我的应用程序每次都需要使用这个.jar文件的最新版本。

免责声明: 我参与了JRebel的开发,因此我的回答可能有点偏颇,但我会尽力解释

为了回答这个问题,我首先想提请您注意,您列出的名称之间的一个主要区别是:有些解决方案需要您更改应用程序设计,而另一些则不需要。

模块化解决方案,如OSGiJBoss Modules,如果您遵循正确的路径并模块化您的应用程序,将带来好处。否则,如果部署一个思洛存储器捆绑包,基本上意味着要重新启动/重新部署整个应用程序,从而减少从这种方法中获得的任何好处。

Play Framework实际上是一个具有热部署功能的全栈框架。这些功能因您使用的框架版本而异。但同样,与模块化的情况相同——框架强制执行特定的编程模型。

Apache Commons JCI并不是真正用于热更新代码的解决方案。AFAIK,它只是通过新的类加载器编译和加载类。这还涉及到更改应用程序代码,就像在上面提到的情况一样。我真的不确定它是好是坏。不利的一面是,你很难以这种方式与生态系统进行任何广泛的整合。这种方法对于利用这一特性的自制框架来说是相当可行的。就我自己而言,我宁愿使用Groovy、JRuby或JavaScript这样的脚本语言来实现同样的目的。例如,类似这样的东西。

JRebelFakerepllaceDCEVM——这些人不关心编程模型。但差别很大:

DCEVM修补JVM,其目标是提供一个完整的热插拔解决方案。

JRebel是一个java代理(与-javaagent-VM参数挂钩),它插入应用程序代码,并通过对类进行版本控制来加载新版本的类。JRebel的主要价值在于,它提供了灵活的配置以及大量特定于框架的集成,因此您可以做的不仅仅是java类的热交换。例如,在Spring应用程序上下文中添加并自动连接新的bean,动态添加新的EJB,以及新的Struts操作,等等。

Fakerepllace也是一个工具代理,就像JRebel一样,但它对Java代码更改的支持要少得多(我认为),而且支持的框架数量也不那么令人印象深刻。

Feenix可以实现Java Instrumentation API允许的功能。这基本上意味着它不会在JVM的标准热交换之上真正增加价值。与AgentSmith相同

更新:这个答案促使Feenix的作者提出了一个新版本-Feenix 2.0,它类似于JRebel处理类的方式。但正如作者自己所说,费尼克斯仍然远远不如JRebel。还有一些类似的解决方案,如HotswapAgentSpringLoaded-这些工具也提供了类似的功能,但有其自身的局限性。

现在谈谈您的具体问题,如何使用JRebel:解决它

应用程序的每个模块都应该有自己的配置文件rebel.xml。所谓模块,我们指的是EAR、WAR或WEB-INF/lib中的任何JAR依赖项(就像您的情况一样)或特定于服务器的库。带有的配置文件指向编译类所在的目录,JRebel将直接从该位置加载类。这一切都意味着,一旦您对Java类进行了更改,就不需要组装整个JAR相反,您可以进行更改并编译源代码(利用IDE,而不是构建脚本)。一旦在应用程序代码中调用该类,JRebel就会重新加载编译后的类。

这个块上有一个新的孩子,RelProxy,它是开源的,不像JRebel那么先进,但它可以用来在运行时自由更改代码的子集并重新加载它,几乎没有性能损失,如果你想的话,在开发和生产中也不需要上下文重新加载(没有会话丢失)。

相关内容

  • 没有找到相关文章

最新更新