在使用maven多模块的结构的时候,同时有多个web工程使用maven-war-plugin的overlay来组织的时候,本地开发时如何在eclipse里面启动容器并且可以热部署调试是个比较麻烦的问题,之前一直使用maven-tomcat-plugin,
不可否认tomcat是最快的,而且也是最方便的,但是有一个问题一直无解,就是overlay支持不好,比如webA有一个a.jsp,webB有一个b.jsp,如果在webB依赖webA,使用overlay打包没有问题,可以把a.jsp和b.jsp全部打到war包里面,但是用tomcat运行webB的时候,a.jsp访问不到。这非常的不方便。tomcat的好处是,修改jsp直接生效,修改类文件会自动重新热部署,比较快。
使用jetty能解决overlay的问题,但是jetty的缺点是启动慢,因为每一次热部署都会在target/tmp下重新部署一份,如果你jar比较多,拷贝就要一定的时间。
但是jetty能很好的支持overlay,下面介绍一下使用jetty配置的几种情况
普通运行模式:
1. 配置手动reload
<scanTargets>
<scanTarget>../childModule/target/classes</scanTarget>
</scanTargets>
<scanIntervalSeconds>0</scanIntervalSeconds>
<reload>manual</reload>
这样配置后每次修改完需要手动输入reload,然后jetty会重新部署
如果修改了childModule里面的类,你会发现不起作用,需要install一下,再reload就起作用了。
2. 配置自动reload
<scanTargets>
<scanTarget>../childModule/target/classes</scanTarget>
</scanTargets>
<scanIntervalSeconds>5</scanIntervalSeconds>
这样每次修改childModule里面的类,会自动reload,但是你会发现修改还是不起作用,仍然需要install一下childModule.
3. 配置手动reload, 不配置scanTargets
<scanIntervalSeconds>0</scanIntervalSeconds>
<reload>manual</reload>
这样每次修改childModule后,手动install一下,再reload一下,也是一样起作用的
3. 无论怎么配置,如果是修改web工程下的类或者jsp,会马上起作用。
Debug模式:
1. 配置手动reload
修改类文件后马上生效,不需reload,如果reload了反而不生效,如果是overlay的web工程里面的jsp,则不行,一定要重新install+reload
2. 配置自动reload
修改类文件后会reload,修改不会生效,需要install后再reload才生效,可能是因为reload后又等于是重新加载了jar包,而jar包还是旧的
总结:开发时使用debug模式,或者普通模式+手动reload最好,scanTargets感觉没什么用