文档章节

开发过程使用Tomcat Maven插件持续快捷部署Web项目

优雅先生
 优雅先生
发布于 2014/10/11 18:35
字数 1334
阅读 29788
收藏 232

    我在平时工作中部署Web项目到测试服务器上的Tomcat时用的是Hudson。Hudson本身已经跟SVN、Git、Maven集成并且支持添加各种插件。但如果使用Hudson,我需要配置两个任务:一个任务负责打包项目成WAR,另外一个任务负责部署打包好的WAR包到目标服务器的Tomcat上。虽然任务只需要配置一次,但每次修改代码提交后,都得切换到浏览器点Hudson构建任务页面上的Build Now按钮,然后还得跳转到另一个页面观察是否有报错,然后再点击执行相应的部署任务。烦不胜烦,偶然发现Tomcat Maven插件支持直接打包并部署项目到Tomcat中,尝试一番后终于搞定,总结于此。

    网上关于这个主题的文章也不少,过程也大同小异,但本文除了过程外还想记录下我期间踩过的坑和关于这种部署方案的建议。


1、准备工作

    下载安装并配置好Tomcat和Maven。

    准备好一个Maven Web项目。


2、Maven部署Web项目到Tomcat的配置

2.1、配置Tomcat角色

    Maven自动部署实际上调的是Tomcat安装目录下的manager功能。而为了能正常访问http://localhost:8080/manager页面,我们需要修改$TOMCAT_HOME/conf目录下的tomcat-users.xml:

<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="manager"/>
  <role rolename="manager-gui"/>
  <role rolename="manager-script" />
  <role rolename="admin-gui"/>
  <user username="tomcat" password="tomcat" roles="tomcat,manager,
      manager-gui,manager-script,admin-gui" />
</tomcat-users>

2.2、修改pom.xml增加Tomcat Maven插件

   我使用的Tomcat7,pom.xml中增加如下配置:

    <properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.version>3.2.2.RELEASE</spring.version>
		<finalName>web-loab</finalName>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<configuration>
					<url>http://localhost:8080/manager/text</url>
					<server>tomcat</server>
					<username>tomcat</username>
					<password>tomcat</password>
					<path>/${finalName}</path>
				</configuration>
			</plugin>
		</plugins>
	</build>

   上面username、password来自tomcat-users.xml。server是Tomcat服务器名称。path是访问应用的路径。url指定Tomcat管理页路径。

2.3、修改Maven的settings.xml

   在$USER_HOME/.m2目录下找到settings.xml,添加server节点:

<servers>
    <server>
       <id>tomcat</id>
       <username>tomcat</username>
       <password>tomcat</password>
    </server>
</servers>

    上面的username、password依然与tomcat-users.xml中相同,id与2.2中的server相同

2.4、部署项目到Tomcat

    先确保Tomcat服务器已经启动,然后cd到项目根目录,运行下面的命令:

mvn clean tomcat7:redeploy

    部署成功,如下:

    然后我们就能在Tomcat安装目录的webapps目录下找到新部署的WAR包。

    初次部署用的是tomcat7:deploy命令,重新部署可以用tomcat7:redeploy命令(推荐统一用这个),Tomcat Maven插件支持的命令包括:run、shutdown、run-war-only、exec-war、standalone-war-only、deploy、standalone-war、undeploy、run-war、redeploy等。


3、踩过的坑

    光看上面的过程,似乎非常顺畅,但世上的事总是不会那么顺利的。下面列举几个我踩过的坑。

3.1、Windows系统下,redeploy过程无法删除旧项目的目录

    报错信息在$TOMCAT_HOME/logs下的catalina日志文件中,如下:

信息: Undeploying context [/web-loab]
十月 11, 2014 3:52:26 下午 org.apache.catalina.startup.ExpandWar deleteDir
严重: [D:\tomcat\apache-tomcat-7.0.56\webapps\web-loab\WEB-INF] could not be completely deleted. The presence of the remaining files may cause problems

    大概是因为Tomcat还在使用这个目录,无法删除,必须修改$TOMCAT_HOME/conf/context.xml:

<Context antiJARLocking="true" antiResourceLocking="true">

3.2、Servelt.class offending

    这个问题应该不属于本文主题范畴了,但可能因为这个导致Web项目启动起来却无法访问,报错信息如下:

十月 11, 2014 3:46:29 下午 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: validateJarFile(D:\tomcat\apache-tomcat-7.0.56\webapps\web-loab\WEB-INF\lib\servlet-api-6.0.29.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class

    原因是webapps目录下的某个Web项目的WEB-INF/lib目录下有servlet-api.jar,删除之,并在pom.xml中指定servelt-api.jar的scope为provided:

<dependency>
	<groupId>org.apache.tomcat</groupId>
	<artifactId>servlet-api</artifactId>
	<version>6.0.29</version>
	<scope>provided</scope>
</dependency>

3.3、版本问题

    确保Web项目的Java Build Path使用的JDK版本、Java Compiler的编译JDK版本以及Project Facets里的Java版本一致。

    如果用的Tomcat6,则pom.xml中配置tomcat6-maven-plugin,如果用的tomcat7则用tomcat7-maven-plugin。或者默认用tomcat-maven-plugin。


4、有关使用Tomcat Maven插件部署项目的一些建议

    这种方案能够实现持续快捷部署。但它有一些局限性:

  • 要求从本地开发环境能直接访问Tomcat服务器所在网段

  • 不能保留历史部署包

    因此初步建议只在开发环境使用这种部署方式,并且结合SVN、Git等版本控制软件做两个内部约定:

  • 所有可部署版本代码都必须先签入一个名为deploy-xx的分支,xx表示当前可部署版本,deploy分支代码必须保证是可以部署的代码,然后切到deploy-xx分支再部署项目

  • 以后增加了新功能,则需新建另一个deploy分支,并增大版本号。这样可以利用版本控制软件帮我们保留各个历史可部署代码(解决了上面提到的第二个局限性)。尤其是多个项目集成时,最好保证每一次集成时各个项目的deploy分支带的版本后缀相同。这样可以方便各个项目代码集体回滚 

完!转载请注明出处:http://my.oschina.net/feichexia/blog/326893

© 著作权归作者所有

优雅先生
粉丝 368
博文 36
码字总数 46290
作品 0
浦东
技术主管
私信 提问
加载中

评论(25)

mefly
mefly
求教先生,我发布项目成功了,在服务器上上传了新的war包, 但旧的同名的项目文件夹还在,而且tomcat还会是访问旧的文件夹里的项目,
<Context antiJARLocking="true" antiResourceLocking="true">加了这句也没起作用
天麟物语
不错,事例很详细,一试就成功了4
优雅先生
优雅先生 博主

引用来自“Dr_啵”的评论

如何知道工程自动部署在本地哪个tomcat 是不是哪里还有对应的配置呢??
2.2节有配置
Dr_啵
Dr_啵
如何知道工程自动部署在本地哪个tomcat 是不是哪里还有对应的配置呢??
coderlu
coderlu
赞赞~~
le2010
le2010
很好
MIC
MIC

引用来自“shuaia”的评论

人生苦短,我用jetty
+1
happycode
happycode
maven, web项目,项目属性,修改project facets ,添加 Dynamic Web Module 支持 ,就可以使用tomcat 来跑了,不用maven 配tomcat插件
Rezeroer
Rezeroer
maven做WEB项目 真的很恶心 
独孤求胜16
独孤求胜16
部署几次后,tomcat就要重启一次
maven redeploy过程无法删除Tomcat旧项目的目录

Windows系统下,redeploy过程无法删除旧项目的目录 报错信息在$TOMCAT_HOME/logs下的catalina日志文件中,如下: 信息: Undeploying context [/web-loab] 十月 11, 2014 3:52:26 下午 org.ap...

Andy市民
2015/08/31
1K
2
Tomcat Maven Plugin部署Maven Web应用

Tomcat官方提供了Maven插件用于部署基于Maven的Web应用,不同版本Tomcat使用的插件不同,不同版本插件的使用也有一定区别,详细信息可参考http://tomcat.apache.org/maven-plugin.html。下面...

大漠真人
2014/09/02
2.8K
8
APubPlat 一款Devops自动化部署、持续集成、堡垒机开源项目、友好的Web Terminal

嗨、很高心你能进入这里,我是zane, 在这里给你介绍一款完整的Devops自动化部署工具 APubPlat - 一款完整的Devops自动化部署、持续集成、堡垒机、并且友好的Web Terminal开源项目。 如果你对...

zane1
06/05
0
0
持续集成Jenkins+Gitlab

持续集成Jenkins+Gitlab 请叫我大宝贝 一、相关概念 1.1 持续集成: 持续集成(Continuous Integration),简称CI,是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并进程自动...

rootliu
02/22
90
0
oschina唯一托管并首发跨端开发大杀器,看不看由你!!!

上周在OSChina上唯一托管并首发的大杀器,强烈推荐。 能力比市场上同类收费工具强很多,技术很优雅很开放,采用Apache v2.0许可证开源模式,诚意打满分! 一、X5是什么 X5是跨端移动快速开发...

就在刹那间
2015/01/20
7.1K
30

没有更多内容

加载失败,请刷新页面

加载更多

开发经验 初学51单片机建议用C语言

typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   新手学习51单片机建议用C语言。因为使用C语言入门的话,上手速度快。实现几个例程后...

志成就
9分钟前
1
0
mybatis异常:nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType

mybatis异常:nested exception is org.apache.ibatis.builder.BuilderException: Error resolving JdbcType 异常详细 org.mybatis.spring.MyBatisSystemException: nested exception is org......

开元中国2015
9分钟前
1
0
Hexo博客搭建

本文默认已经安装好git和node.js环境 版本说明:git version 2.16.2.windows.1 、 node.js v8.9.4 Hexo是什么   Hexo 是一个快速、简洁且高效的博客框架,这里不多介绍,丢个链接,感兴趣的...

逸竹小站
34分钟前
2
0
学习记录 Vue(模板,差值表达式,v-text,v-html,v-bind,v-model,v-if,v-show,v-for,v-on,this关键字,按键修饰符)

模板示范 <div id="d1"></div><script> new Vue({ el:"#d1", //作用的区域 data:{//参数 }, methods:{// 函数 ......

Pole丶逐
36分钟前
2
0
vue vue-router beforeRouteEnter

本文转载于:专业的前端网站➬vue vue-router beforeRouteEnter beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `thi...

前端老手
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部