一、问题出现
事情是这样的,原本我们web项目每一个都是独立的,顶多是依赖一些打包为jar的公共项目模块,但是webapp下的资源文件还是独立的。但是,由于我们自己封装的框架包含着一部分公共的前端资源文件(js、css、img等)和页面模板,当web项目多了,文件冗余自然就多了,如果框架需要调整修改,那得每个项目都要改一遍,那不是烦死?所以,我们决定想办法把这部分文件也要抽取出来,像jar包一样需要用到就通过maven依赖进来就行了。但是,这些在webapp下的文件应该是一个web项目的结构啊,那应该是编译成war包,也就是说war包需要依赖war包。然后听老大说maven3以上是支持war依赖war的(maven真不是盖的,gradle不要欺负人家),所决定重构一下项目(重构这个词挺吓人的)。。。
问题出来了,我们原来使用的tomcat7-maven-plugin插件运行(tomcat7:run)项目时,居然没有把所依赖的war给打包进去!项目是跑起来但是页面是裸奔的啊。。。(因为核心的js、css等都找不到)但是使用maven的install命令打包出来的war是有包含所依赖的war的内容的。那就奇怪了,一定是tomcat7-maven-plugin搞的鬼,然后找了很多相关的配置资料,心想应该是overlay的配置问题,找了很久试了N遍还是不行(反正是没解决,不要找借口也不多说了),但是其他的兄弟还要开发调试呢,我这个分支也急需合并到主分支,所以只能另辟蹊径了。
二、问题分析
既然install打包是正常的,那我使用外部的tomcat来部署应该是没问题的,马上下了个tomcat,先把生成的war扔进去跑一下再说,噔噔噔果然没问题。OK,那么使用Eclipse绑定外部的tomcat,解决debug调试,配上虚拟路径,再顺便把JRebel
6配上去(之前JRebel 5 配上但是有bug有时会失效,听说JRebel 6 修复了)实现热部署,只要修改完成后重新install一下,不需要重启tomcat,也是个不错的解决方案~只是以前修改网页资源文件都可以立即更新,现在需要install一下了(非“Hot Code”代码不用install也会重新加载),但这也是没办法的办法了。不要问为什么不用自带的tomcat server,我们用的是Eclipse javase版本(当时装错了哈哈哈,哭),而且我们也试过tomcat
server和tomcat7-maven-plugin一样没有把依赖的war打包进去,于是在网上找到了tomcatPlugin这个插件,下了个最新版本V331,再下个JRebel
6.3.0,可以开始干了。
tomcatPlugin下载:http://www.eclipsetotale.com/tomcatPlugin.html
JRebel 6.3.0(破解的你懂的)
三、解决步骤
1、装好tomcatPlugin插件(离线安装,放入Eclipse的plugins目录即可),重启服务器后就出现了下图中的按钮:
2、进入Window->Preferences->Tomcat中,绑定下载的tomcat,别忘了在Server.xml或Catalina/localhost中配上虚拟路径指向target中的web项目。
3、进入JVM Settings把下载好的JRebel配上,点击一下【Create a launch Configuration】(你可以不点试试,我一上来就点了,也没试过不点行不行 = = 在同事的机器上没点貌似是不行的),根据自己的文件路径配好。因为JRebel是JVM插件,所以是配在JVM参数的-javaagent参数中,红框下方的参数是只配了上方参数运行时,JVM提示必须加上的,具体作用我这里就不深究了。
4、把项目的源文件绑定上,才可以debug调试。
5、把项目都install好,点击【Start Tomcat】成功启动没有报错,启动过程中出现下方日志,则代表绑定上JRebel了:
6、修改一下log4j.xml再重新install,出现下方Reloading configuration则说明JRebel热部署已经生效了,赶紧打个断点调试起来吧~
四、总结
其实热部署也没那么热,当修改到一些“Hot Code”时,JRebel是不会重新加载代码的,但是至少修改一些配置文件还是不用重启的,甚至是修改了一些依赖的jar项目的代码也不用重启哦。
解决方案有很多种,这种一定不是最好的解决方案,但是重要的是有没有解决好问题,还有解决问题的思路,最后就是挑选最简单最适合团队的解决方案了。这次深刻体会到集成开发是有多么伟大,假如所有的工作不使用Eclipse、maven、JRebel等工具插件进行开发,从编码和编译到调试和部署,起码多出10倍的工作量!所以,优秀的程序员就应该使用计算机自动化完成重复的工作,less
is more!
最后,如果博文有错误的地方,恳请指正;如果有更好的思路和解决方案,跪求分享;如果有好的想法,欢迎交流!