设为首页 收藏本站
查看: 969|回复: 0

[经验分享] 基于tomcat插件的maven多模块工程热部署(附插件源码)

[复制链接]

尚未签到

发表于 2015-8-7 08:14:51 | 显示全部楼层 |阅读模式
  内容属原创,转载请注明出处

写在前面的话
  最近一直比较纠结,归根结底在于工程的模块化拆分。以前也干过这事,但是一直对以前的结果不满意,这会重操旧业,希望搞出个自己满意的结果。
  之前有什么不满意的呢?
  1. 基于maven拆分模块后,热部署的效果不好,经常出故障。
  2. 对于多个子web工程,不能做到任意一个web工程都可以放到tomcat里运行,要在外面搞个壳子组合多个工程。
  于是,有了这纠结的一周,也有了此文。

本文关于什么
  如标题所言,本文涉及到如下几个内容:
  1. maven多模块工程
  2. 基于tomcat插件的热部署
  且听我一一道来。
  

maven多模块
  这次,采用了如下的结构来构建模块:
DSC0000.jpg

1. 工具工程
  之间的依赖关系相对较多,采用了子模块的方式处理,所有工具工程都是 com.up.tool 下的模块工程。




com.up.tool.a
com.up.tool.b

  

2. 基础工程
  基础工程都放在com.up.base目录里,包含系统的基础框架的内容,但是和具体业务无关。
  所有第三方的依赖以及对工具工程的依赖,都在基础工程里处理。
  考虑到war类型的maven工程的依赖传递搞不定,com.up.base工程的packaging采用了jar,同时通过ant脚本另外再打war的内容以及发布。
  ant插件打war且发布的脚本:


DSC0001.gif DSC0002.gif



${project.artifactId}-${project.version}
http://192.168.1.254:8080/nexus/content/repositories/




org.apache.maven.plugins
maven-antrun-plugin
1.7


打包其他文件
package   

















run



install到本地
install















run



deploy到仓库
deploy




















run






结合ant插件发布额外war包  
  为了避免版本号到处飞以及引入其他不需要的第三方依赖,对所有依赖的第三方包做了如下处理:






3.1.4.RELEASE




org.springframework
spring-aop
3.1.4.RELEASE


*
*





避免版本号到处飞以及屏蔽无用依赖  3. 业务工程
  都以com.up.web为父工程,同时,依赖基础工程 com.up.base






com.up
com.up.web
1.0.0.1-SNAPSHOT



com.up
com.up.base
1.0.0.1-SNAPSHOT


com.up.web
com.up.web.a
1.0.0.1-SNAPSHOT
war
业务工程的基本配置  同时,为了避免业务工程打出来的war包里包含依赖的其他的jar/war的内容,在com.up.web工程里做了如下处理:






${project.artifactId}-${project.version}




org.apache.maven.plugins
maven-antrun-plugin
1.7


after-package
package

run





























ant-contrib
ant-contrib
1.0b3


ant
ant




commons-net
commons-net
1.4.1


org.apache.ant
ant-commons-net
1.8.1





基于ant插件重新打war包  这样,既保留了可以直接运行的war包,也保证发布到仓库的war包只包含工程自身的内容。

基于tomcat插件的热部署
  上面基本上把项目的多模块结构描述了,接下来该是热部署的事情了,怎么才能达到效果呢?
  寻求方案的痛苦过程不再多说,在看到这篇博文后,把方案定下来了
  参考博文:配合m2eclipse,改造tomcatPluginV321根据maven的依赖自动热部署.
  既然已经有大侠基于这个插件做了支持maven的改造,咱也可以这样干。

  开发环境:
  1. Eclipse Java EE IDE for Web Developers. Version: Luna Release (4.4.0)
  2. tomcat插件 org.uqbar.eclipse.tomcat.xt.features_2.0.0
  3. maven3.2.1

  实现方案:
  1. 基于上面“参考博文”的方式,改造tomcat插件支持配置use Maven
  2. 调整当设置use Maven的时候,设置webRoot为 target/webapp
  3. 启动tomcat前,根据maven依赖的jar以及war,拷贝相应内容到target/webapp并开启监听
  具体为:
  对于依赖的jar,拷贝jar到target/webapp/WEB-INF/lib
  对于依赖的war,解压缩后拷贝到target/webapp
  对于依赖的jar或者是war,如果对应工程在工作空间而且是open状态,那么对target/classes,src/main/webapp 目录增加文件变化监听,实时把修改的内容拷贝到target/webapp下对应目录(文件变化监听基于JNotify实现)
  4. 启动tomcat,docBase为target/webapp
  5. 终止tomcat时,停止文件监听(需要通过插件的终止功能,否则文件监听未停止,可能导致maven clean 失败)
  6. 增加切换工程的功能,点击时切换tomcat里的context为当前选中的工程(只支持一个工程)

  实现效果
  做了上面调整后,达到了如下效果:
  1. 设置了工程为tomcat工程而且选中use Maven后,插件会在启动前拷贝所有通过maven依赖的内容到target/webap
  2. 在工作空间打开而且被当前tomcat运行的工程依赖的工程,修改的内容会实时同步到target/webapp(注意设置tomcat插件里的reloadable为false,即不选中该选项)。
  由于tomcat运行的docBase为target/webapp,当所有修改的内容可以实时拷贝到target/webapp时,也就实现了热部署的效果。
  

问题是什么
  目前的方案有如下问题:
  1. 启动的时候的拷贝,会导致启动tomcat延迟3到4秒。
  2. 如果没通过插件关闭tomcat而是直接通过控制台关闭,会导致文件监听未停止,可能造成maven clean失败。
  3. 要求所有工程的output dir都是 target/classes,要求web的root都是 src/main/webapp 也就是maven的标准配置,否则会有问题。
  4. 插件只支持eclipse4.4,连eclipse4.3都不支持,未追究原因。
  

插件及插件源码下载
  org.uqbar.eclipse.tomcat.xt_2.0.0原始插件参见其官方网站
  修改后的插件及源码

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-94929-1-1.html 上篇帖子: Tomcat集群和Session复制说明 下篇帖子: tomcat下的server.xml文件和context.xml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表