`
truemylife
  • 浏览: 228255 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

M2eclipse与tomcatplugin实现应用布署

阅读更多

 

M2eclipsetomcatplugin布署使用

背景:之前我们在项目里maven的使用还是比较弱,主要就两点应用 

   编译依赖,扩展nexus私服库,对使用的依赖jar包进行版本统一管理。

   扩展continumm,进行自动发布和自动集成单元测试。

问题:没有使用m2eclipsetomcatplugin完成热布署之前,为了能直接启动tomcat,把web应用的输出目录直接放在工程下的src/main/webapp,编译输出也直接放在src/main/webapp/WEB-INF/classes,单元测试输出放在src/main/webapp/WEB-INF/test-classes,还要拷贝maven依赖下的jar包到WEB-INF/lib目录。这样做虽然能启动tomcat,但是带来其他一些不便和管理上的不规范

首先拷贝jar包到lib,即增加了管理的时间,又可能导致编译依赖版本与lib下的运行版本不一致问题。

maven规范输出路径是target,因此每次对Maven->Update Project Configurations,会发现Java Build Path->source下的Output又统统变回到target下的目录。然后只能又手动改回去..

Junit做单元自测时,也是只认target目录,没办法,每次做自测之前,必须Run  Configurations->Classpath- >Advanced...,把当前src/main/webapp/WEB-INF/classessrc/main/webapp/WEB-INF/test-classes加进来,这样才不会报ClassNotFoundException错误。效率很低。

目标:对应以上问题,通过M2eclipsetomcatplugin热布署后,解决三个问题

工程里去掉lib目录,发布时自动根据pom.xml里描述加载需要的包。

把编译输出路径改成与maven规范一致的target路径,这样preferences->Maven->User  Settings进行Update Settings操作后还是原来的路径。

Junit单元测试时,不用每次都Run Configurations

M2eclipsetomcatplugin实现布署

一、下载tomcatplugin3.3,可以上官网下载,本站提供下载:http://resource.caidao8.com/technique/tomcatPluginV33.zip

    同时必须下载经网友修改的tomcat.jar。本站提供下载:http://resource.caidao8.com/technique/tomcat.jar

    如果你有兴趣可以下载源码:http://resource.caidao8.com/technique/tomcatsrc.rar

  下载完后,把com.sysdeo.eclipse.tomcat_3.3.0拷贝到你的eclipse(我这里的eclipse3.5,同时也试过3.6 plugin目录,如果你已经有低版本的tomcatplugin,最好删除掉再拷贝。这样你的tomcatplugin插件就搞定了。

二、下载tomcat6tomcat7后,设置Prefefrences->tomcat,如果你的eclipse版本在3.5之前,eclipsePrefefrences->tomcat选项里还没有version tomcat7.x。不过还是可以通过选tomcat6.x,实际上加载的tomcat7。如下图配置

在要

 

要注意,如果加载tomcat7要在JVM-Settings加入tomcat-juli.jar,这是tomcat6.x加载tomcat7时额外要做的( tomcat 6不需要做这一步),否则一点start就会报找不到相关类。加载tomcat-juli.jar如下图:

 


三、接下来打开第一步com.sysdeo.eclipse.tomcat_3.3.0目录,看到有个Devloader.zip,还有一个DevloaderTomcat7.jar,如果你是Tomcat7,把DevloaderTomcat7.jar拷贝到TOMCAT_HOME/lib/目录下,如果是tomcat6,把Devloader.zip拷到TOMCAT_HOME/lib/目录下并重命名成Devloader.jar。如果是其他更低版本,直接解压Devloader.zipTOMCAT_HOME/server/classestomcat67经测试都没问题,更低版本未经测试。

四、把当前工程设置成tomcat project

右击工程->properties->tomcat如下图

Is a Tomcat Project打上勾

Context name为空,

Subdirectory to set as web application root(optional)工程发布的目录 /src/main/webapp

接下来点击Devloader Classpath,如下图

从上图可以看到有两个选项

Use MavenActivate DevLoader,而实际上使用标准的tomcatplugin插件,只有Activate  DevLoader一个选项,如果你只出来一个选项,那么注意第一步下载了tomcat.jar,把它覆盖到com.sysdeo.eclipse.tomcat_3.3.0目录下的tomcat.jar再重起eclipse,就发现有两个选项了。Activate DevLoader选项是把全部的maven repository下的jar都列出来让开发人员选,这样比较麻烦,因为repository里可能有好几个小版本,都给列出来后然后慢慢选,效率太差,而且还是没跟pom.xml描述挂勾。Use Maven选项,根据pom.xml描述自动加载,这样只要关心pom.xml的描述,只要确保pom.xml描述的统一与正确,各开发人员发布的版本就是一致的。设置完成后 点一下Apply,然后点eclipse上面的tomcat start,一切顺利运行,就算搞定了。这里说一下这里的Apply,根据刚才第二步tomcat的设置,我们用编辑器打开TOMCAT_HOME/conf/server.xml,先观察下它的初始配置,当你点击一下Apply后,会发现server.xml被修改了。根据当前步对tomcat project的配置,发现server.xml多出代码片段

<Context path="" reloadable="true" docBase="E:\projects\cmac\src\main\webapp"  workDir="E:\projects\cmac\work" >

   <Loader className="org.apache.catalina.loader.DevLoader" reloadable="true" debug="1"  useSystemClassLoaderAsParent="false" />

</Context>

如果再次点击Apply,会再多出一段这样的代码,因此配置好后,不要重复点击,否则就会重复布署多个应用了。如果重复点了,只好手动去编辑server.xml,并删除多余的配置。

同时细心观察的话,可以看到在工程下还生成了.#webclasspath文件,里面就是描述了输出的类及需要的依赖jar包列表,如果你想查看加载包是否正确,可以直接打个这个文件查看。

实施过程中需要重点了解的概念

1、重点要了解pom依赖描述的scope,classifier两个属性

scopemaven的生命周期有关系,主要有五种状态:

默认是compile,传递整个生命周期并最终输出。

provided,最终不输出,比如servlet-api.jar,在编译的时候是需要的,但是发布的时候就不能输出,因为tomcat自带了servlet-api.jar,如果输出的话,会引起冲突,当然也可以使用system方式,在依赖描述的时候就使用tomcat下的servlet- api.jar

test,比如spring-test,这种只在测试阶段使用。

runtime,编译时没用,只在测试及运行时用。

system,与provided类似,如第二点所讲,直接引用外部jar包,而不去maven  repository下找相关jar了。

2classifier一般是指当前的包有的限制性,比如只适用于jdk1.4或其他的一些限制,如果包有这种属性,将不能被发布,这时我们修改名字,再传到nexus私服,去掉classifier属性就可以了。

路径问题的解决

工程采用了M2eclipsetomcatplugin布署后的第一天一切顺利,但次日一早过来把WEB-INF下的classes目录彻底删除后,出现了新问题,起动Tomcat会报找不到/WEB-INF/classes/log4j.properties,也找不到/WEB- INF/classes/ApplicationContext*.xml

       需要修改这里的配置方式改成如下配置

<context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:applicationContext*.xml</param-value>

    </context-param>

<context-param>

              <param-name>log4jConfigLocation</param-name>

              <param-value>classpath:log4j.properties</param-value>

</context-param>

 

0
7
分享到:
评论
4 楼 leehow1988 2013-08-29  
针对这个问题自己跟了下源码发现是maven版本的问题,后来个人DIY修复了一下,而且做了扩展来实现图形化界面自定义是否加载maven项目的测试时期的代码和jar包。哪位看到楼主此文需要的话可以一起探讨

leehow1988 写道
是这样,经过自己配置 “Use Maven选项”勾选后即便是自己设置了servlet-api.jar的scope为provided这个tomcat插件在“.#webclasspath”文件中还会引入servlet-api.jar这样自己启动tomcat的时候就会报错:
"javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name “javax/servlet/http/HttpServletRequest”"
不知楼主遇到过没,怎么解决的难道能设置tomcat自动识别maven的scope属性

后来本人解决方法是采用“Activate DevLoader”选项,这样当然有点不好了



备注:本人只是试试的,建立的maven简单的web工程写了一个jsp和servlet实验没有采用任何框架

3 楼 leehow1988 2013-08-27  
是这样,经过自己配置 “Use Maven选项”勾选后即便是自己设置了servlet-api.jar的scope为provided这个tomcat插件在“.#webclasspath”文件中还会引入servlet-api.jar这样自己启动tomcat的时候就会报错:
"javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name “javax/servlet/http/HttpServletRequest”"
不知楼主遇到过没,怎么解决的难道能设置tomcat自动识别maven的scope属性

后来本人解决方法是采用“Activate DevLoader”选项,这样当然有点不好了



备注:本人只是试试的,建立的maven简单的web工程写了一个jsp和servlet实验没有采用任何框架
2 楼 truemylife 2012-09-03  
只是开发环境使用习惯问题,如果你觉的通过maven的tomcat插件完成每次的调试、热布署更快,那就用maven自带的tomcat插件并无不妥。
1 楼 mojunbin 2012-08-31  
为何需要使用tomcatplugin呢?maven不是有自带tomcat插件么?我没有完全看完文章,有不对的请多多指教了

相关推荐

Global site tag (gtag.js) - Google Analytics