快捷搜索: 王者荣耀 脱发

解决Intellji Idea修改代码以后无效的问题

问题描述

正常情况下修改完代码,再次执行应该会执行新的逻辑,但是发现最后实际运行的还是老的代码逻辑,而新代码根本没有生效并且即使重启idea还是重启tomcat都没用。但是通过 mvn 打包(pakage)或者部署(install) 后,再运行发现又好了,但是显然非常麻烦。

解决方案一

    先说说我刚开始一个治标不治本的方法,修改tomcat配置如下: 我希望每次失去焦点时,IntelliJ IDEA 能帮我重新编译我修改过的类的类。当然仅仅这样还是不够,因为一开始我就是这样配置的,我一直觉得已经达到了热加载的效果了,class应该会自动更新才对,结果是我错了。 事实上我还需要在修改过的类文件上点击右键,选择Recompile重新编译(快捷键Ctrl+Shift+F9)。 Recompile:对选定的目标(Java 类文件),进行强制性编译,不管目标是否是被修改过。

解决方案二

    首先第一个方案还是治标不治本,仍然很麻烦。百度了很多人的解决方法始终不能满足我的需求,于是我开始思考原因。 从表现上看就像是idea保留着缓存,Recompile一次后就会优先读取这个重新编译后的文件。通常我们编译后的class文件都会输出到webapp/WEB-INF/classes文件夹中,于是我将此一个类在此文件夹下对应的class文件按类的源文件修改前、修改后和Recompile后三种情况下分别备份后进行比较发现,修改前和修改后的class是一样的,当Recompile后class信息发生了改变。但是我之前配置项目的时候,输出的文件路径不应该是在webapp/WEB-INF(maven项目则是target目录)下啊,于是我把classes(或者target)整个文件夹删掉,重启服务器后,你会发现webapp/WEB-INF下的class文件又会重新生成,所以可以得出结论当你Recompile文件的时候,重启服务器,服务器打包用的类文件是webapp/WEB-INF下面的classes,所以把它删掉重启就可以了。 看上去好像就是tomcat自动加载的配置没有生效似的,但是你查看你项目下的文件目录会发现idea帮你生成了一个out文件夹,打开发现里面居然也有我项目源码中的所有class文件,然后我打开Project配置终于找到了原因。 原来idea会默认帮我们生成一个out目录,该路径下就会保存我们所有项目后编译后的文件,但是由于我们tomcat下发布的war包所使用的是WEB-INF下的classes文件,所以就造成了实时编译后的java文件没有生效,而执行了mvn clean操作或者删除classes文件夹后,idea会强制对所有文件进行编译,于是才得以生效。 修改方法也很简单,将上面的output路径改为WEB-INF/classes或者是taget/classes路径下即可,如果是多模块项目,也可以为每个模块设置一个编译输出路径: 就是这么一回事,问题终于得到解决。

解决方案三

    上述问题是我在使用一个传统的web项目遇到的问题,但是我通常构建的maven项目却没有遇到此问题,所以你可以尝试把项目转化成一个标准的maven项目试试。 或者下载最新版idea,因为上述问题是我在使用2018版的idea时候遇到的,可能多年以后,idea已经帮我解决的此问题,当然,如果还是不能解决,可以直接装一个热部署神器,具体步骤请参考:
经验分享 程序员 微信小程序 职场和发展