Java 如何设置在虚拟机上运行的Tomcat以启用远程调试以及热交换同步文件更改?

Java 如何设置在虚拟机上运行的Tomcat以启用远程调试以及热交换同步文件更改?,java,tomcat,virtual-machine,Java,Tomcat,Virtual Machine,为冗长的解释提前道歉 我们有一个使用RabbitMQ服务器、Tomcat web服务器、MySQL数据库和Hadoop环境的大型web应用程序。大多数团队使用Windows,一个使用Ubuntu,但我们使用CentOS作为部署环境。我们最近开始使用vagrant和ansible跨多个环境标准化环境配置和部署。这是提高应用程序质量的一部分,有助于我们避免不同环境之间的故障 我们现在已经完成了大部分工作,在过去的几天里,我一直在研究复制(甚至改进)我们当前的开发过程,包括构建、运行、调试和热交换微小

为冗长的解释提前道歉

我们有一个使用RabbitMQ服务器、Tomcat web服务器、MySQL数据库和Hadoop环境的大型web应用程序。大多数团队使用Windows,一个使用Ubuntu,但我们使用CentOS作为部署环境。我们最近开始使用vagrant和ansible跨多个环境标准化环境配置和部署。这是提高应用程序质量的一部分,有助于我们避免不同环境之间的故障

我们现在已经完成了大部分工作,在过去的几天里,我一直在研究复制(甚至改进)我们当前的开发过程,包括构建、运行、调试和热交换微小的代码更改,而无需重新启动应用程序。我们现有的设置使用嵌入式Jetty(在eclipse中),我们可以在运行或调试模式下运行Jetty。使用此设置,我们可以放置断点,导航到相关页面,当断点激活时,我们可以单步执行代码,从堆栈中删除帧以再次运行方法,甚至对代码进行微小更改(在JVM热交换规则范围内)。当然,这对我们非常有帮助

我希望尽可能多地复制这种行为,除了不使用嵌入式jetty实例之外,我希望在虚拟机上远程调试tomcat实例,但仍然能够对代码进行更改,而无需每次重新启动tomcat。在这一点上,我可能应该指出,我知道JRebel,但在这一点上,我们的团队被认为是不可行的

此时,我已经成功地自动同步(使用vagrant);'src/main/webapp/WEB-INF、'target/classes'(由eclipse编译)和'target/lib'(由maven copy dependencies插件创建)。这些都同步到虚拟机上的正确位置,因此tomcat认为这是一场爆发的战争。我已正确设置tomcat,使其在调试模式下运行,我已使用eclipse连接到它,并通过放置断点成功进入调试模式。对其中一个同步进行任何更改ed文件导致tomcat重新启动应用程序并使用新文件

剩下的唯一问题是,当我保存对文件的更改时,我丢失了所有会话数据,我必须等待重新部署完成,然后重复适当的步骤返回断点。这显然是一个很大的时间浪费

因此,经过冗长的解释,我的问题是:

  • 有人成功地实现了我的目标吗
  • 我想做的事可能吗
  • 如果有的话,有没有人能帮我完成配置
  • 我可以在不触发上下文重新加载的情况下进行热类替换吗

  • 如果有任何帮助,我将不胜感激,并为这篇文章感到抱歉!:)

    我不知道Eclipse,但我使用NetBeans。我使用调试器连接到远程Tomcat实例,我可以使用“应用代码更改”会导致JVM Tomcat运行时只重新加载更改的类的功能。Jamey,失去会话和应用程序状态正是JRebel解决的问题。如果您感兴趣,请给我一条消息,如果我们可以改进以使其适合您的环境,该怎么办?我正在参与产品的开发。啊,我的抱歉。我的意思是在财政上可行,我毫不怀疑它会非常适合我们的环境。:)