最近遇到一个非常困扰的问题,在Eclipse。我修改了一个类,但是无论如何tomcat都没有更新类。
先给出我的方案,删除旧的工作空间文件夹(或更改名称、位置)。
因为我是弃用了旧的工作空间,并新建了新的工作空间。目前我发现的原因是因为JRebel的监听的旧的工作空间的项目,并把编译好的类扔给内存中运行的Tomcat容器(查看JRebel的介绍,JRebel是会保留该类的所有现有实例)。所以,我在Tomcat的部署目录下看到的是新的编译好的类,但是实际上Tomcat运行的是旧的类。
JRebel是会保留该类的所有现有实例
背景,因svn恢复并迁移(因文件损坏,svn服务器回滚到了一个月前的版本,并切换了新的地址)。我弃用并备份了旧的工作空间,重新检出了新的svn,并在Eclipse重新建立新的工作空间并导入项目,但是发现有一个项目无论如何都无法更新类,发现一直都是运行旧的类。我尝试了以下的方法:
- 常规的Clean Up Project
- 常规的Clean Up Tomcat 目录,甚至整个类删除,启动依然正常。
- 更换Tomcat的部署目录。
- 重新建立新的工作空间,并重新导入项目。
- 打开调试,能够进入调试。但是发现断点的位置和运行的不一致。初步怀疑运行的不是最新的.class。
- 怀疑是代码有错,Eclipse跳过最新版本的编译。但是,观察Tomcat部署的路径,核对.class文件的更新时间,并打开.class查看,的确是最新的代码。
- 再三确认,Tomcat的运行路径,完全正确。
- 怀疑是JRebel插件的问题,关闭JRebel插件。问题依旧。
- 怀疑是nginx的进程没有关闭完全,指向了其他的机器。但是控制台是正常打印的旧的类,完全关闭nginx进程并尝试,失败。
- 怀疑是内存驻留了旧的代码,重启计算机。重新发布运行。还是旧的类。
- 从Eclipse更换至Intellij,还是一样。仍旧运行旧的类。
事情的转折
- 在开启JRebel 情况下,观察控制台,发现JRebel 监听的路径是旧的路径,但是天真的以为JReble监听的路径和Tomcat运行的没有关系。**但是去查看JRebel的工作原理,就可以发现如果是监听的旧的工作空间,那么JRebel会把旧的类丢给tomcat容器运行,而你无法发现。因为Tomcat的部署目录是没有任何变化的**。
image.png