Maven多web模块工程构建各种Error listenerStart启动失败情况及最终解决过程记录

来源:互联网 发布:华硕笔记本怎么样 知乎 编辑:程序博客网 时间:2024/06/06 05:18

      最近打算把手上的一个普通Maven的Web工程改造成支持不同业务Web模块,并支持灵活的插拔效果的框架。在这个过程中因为对maven的模块组合设计不太清楚,走了很多弯路。特记录整个过程留作以后参考使用!

     首先拆分模块,最开始的Maven工程名称比如叫 fmcgwms,里面把所有业务模块的web层,control层和service层还有dao层都写在一起。然后根据业务的需要,把所有基础的  service层还有dao层拆分为common模块,提供给其他业务模板调用,把系统核心web层访问框架封装为web模块,其他各子业务模块拆分为 demo1 ,demo2....等不同的web工程模块。

    模块拆分完毕以后,是给各个maven工程配置pom.xml文件,错误由此开始。

    首先把common模块设置为jar包模式

    如下图:

   


    然后可以正确执行 package打包命令,最终生成 fmcgwms-comon-0.0.1-SNAPSHOT.jar

     接着把demo1业务模板设置为war包模式

   如下图:

      

  然后执行package打包命令,提示找不到依赖的jar包,因为是本地自建的工程,所以在公网的仓库中不存在该jar包

       

   解决的办法是把fmcgwms-comon install在本地仓库中,然后再执行demo1工程的package命令,可以执行成功。

   接着把主web工程也设置为war包模式

 如下图:
     
  并且利用 maven-war-plugin 进行不同web工程的合并,如下图:
   

  然后执行package打包命令,提示找不到依赖的 demo1工程对应的  war包,原因同 之前jar包找不到一致,于是重复之前的install操作,把 demo1工程对应的war包也保存在本地私有仓库里面
   最后执行package命令,可以打出包含demo1工程和common工程代码的正确的war包,把该war包单独放在tomcat的webapps下面执行,可以正常访问之前的整个web工程!
 
   本来以为就这样就实现了maven多web工程的合并,但是考虑到实际开发的需要,应该是在开发工具中热部署不同模块和实时的dubug修改的代码,所以想(ˇˍˇ) 像之前启动单个Maven工程一样启动整个合并的多web的maven工程。

   于是悲剧的一幕就马上发生了

   我把fmcgwms-web工程加入tomcat中执行,启动就报:
  
  百思不得其解,不明白为什么会报类找不到,于是一顿网上查询,各种可能,包括:

   1.fmcgwms-web的是不是没有引入相关的fmcgwms-comon的jar包

        如类似下图:
  

  
  
  按照这种类型的问题,查看了自己工程,不存在该情况,同时再手动设置了classpath的值,然后重新启动N次,依然不能启动!!
   

  2.怀疑是tomcat脏数据问题,引起启动失败

    网上很多人说可以重新清理tomcat,重新Add  and Remove web工程,可以启动成功。
   可是通过N次清理,包括重新建立eclipse的worksapace,重新建立tomcat的service服务器,下载各种不同的版本的tomcat,统统不行!

  3.怀疑是eclipse的xms和xmx JVM内存设置过低,引起编译不全

   网上有些帖子建议加大eclipse的JVM设置来解决该问题,但是自己加的再大,也没有用,还是报类找不到,启动不了。

  4.怀疑单独java类的web.xml中配置问题

  把web.xml中HihSoftSessionListener注释掉,然后再启动整个web工程,任然报其他类找不到,因此怀疑是整个fmcgwms-common jar加载出了问题。

  5.想通过tomcat的启动日志查询具体的失败原因

  查询了网上一个帖子:地址:Tomcat启动报Error listenerStart错误,安装其提示,做了log日志的配置,但是因为是在eclipse中的tomcat启动失败,而但是部署在tomcat中能正常启动,因此这个方法也没能找出具体的原因。

事情的转机

    因为实在想不通为什么会启动不了,因此各种不同情况的尝试,换eclipse,换tomcat版本,换eclispe的workspace,换工程的名字,终于在一次无意之中,当我把common工程没import进eclispe时,只保留 demo1和web模块时,正常启动了!!!高兴坏了!
并且还能热部署demo1和web模块。
    高兴之余,考虑是不是该把common工程引进来,让common工程也能热部署啊,于是高兴的引入common工程,一番package后,再次启动tomcat。。我擦。。。。悲剧发生了,再次报 类找不到,不能正常启动tomcat的web工程。

     于是我再一次懵逼了,WHY------------------------
     继续各种尝试,换eclipse,换tomcat版本,换eclispe的workspace,换工程的名字,各种折腾,始终不能正常启动,在这个过程之中我自己没有发现的问题时:我都同时把comon工程引入了当前的eclispe中。
    最后在csdn上面找到一篇文章,和我的现象是一样的。本地tomcat调试有maven依赖的工程,提示找不到类,重要发现只要common工程不引入,或者引入后关闭common工程,web工程就能正常启动!但是为什么会这样,到现在我也没找到一个官方或者正式合理的说明:只能猜测当web工程导入common的jar包,并且eclispe正打开common的工程时,tomcat发布启动时会有冲突!

     虽然发现问题的所在,但是如果开发人员每次都要关闭common工程,并且如果common工程经常改动的话会非常不方便。所以还得继续寻找更完善的方案。
      中间有寻求jetty插件来启动,但是一样会存在这个问题。

最终的解决方案

    问题又回到了原点,还是的重新组织不同业务模块的maven war包成的pom文件设计,最终的方案是 在所以子模块和基础模块之上再建一个公共的父模块,系统结构如下:

        

父工程pwms的pom文件关键内容如下:
   

 
comon模块的pom.xml文件如下:
   
demo1(pad)模块的pom.xml文件如下:

     
  web模块的pom.xml文件如下:
     
  web工程合并:
  

       配置完成后,执行父模块的总的pom.xml文件,执行clean package ,顺利成功打包成功,并且不需要再为公共模块和子模块执行install命令,最终成功tomcat启动web模块成功,并且可以任意修改公共模块和子模块的jsp文件和java文件,并且热部署,非常方便!

      插曲:在成功用tomcat启动后,我用jetty启动web工程,没启动,结果引起tomcat也起不起来了。后面重新部署工程才有启动成功。
     

     总结:


     部署完成后,发现其实挺简单的,但是由于在开始做之前没有明确正确的方式,致使走了很多弯路(虽然过程中也学到很多东西),所以以后再进行其他东西的学习和研究中,一定要记得先找好方向和办法,不能完全凭自己的感觉胡乱摸索!!切记,切记!!!

    参考文章: 
     Maven多工程、多模块
      maven中的snapshot来源与注意事项
     maven多模块项目,多web合并项目使用心得
0 0
原创粉丝点击