您的位置:首页 > 运维架构 > Tomcat

使用Maven Cargo 插件管理Tomcat6的部署

2014-02-11 09:37 344 查看
通过  把一个Web项目发布到本地或者远程Tomcat环境 来分析,
<properties>
<org.springframework.version>3.0.3.RELEASE</org.springframework.version>
<org.slf4j.version>1.5.10</org.slf4j.version>
<!-- 跟Cargo发布项目相关-->
<myproject.name>cargosample</myproject.name>
<cargo.project.groupid>${project.groupId}</cargo.project.groupid>
<cargo.project.artifactid>cargosample-webapp</cargo.project.artifactid>
<!--可单独提取并配置到profiles文件来激活 -->
<catalina.home>${env.CATLINA_HOME}</catalina.home><!--D:\hudson_ci\hudson_dep_tools\Tomcat6.0-->
<cargo.tomcat.manager.hostname>127.0.0.1</cargo.tomcat.manager.hostname>
<cargo.tomcat.manager.port>8080</cargo.tomcat.manager.port>
<cargo.tomcat.manager.ajp.port>8009</cargo.tomcat.manager.ajp.port>
<cargo.tomcat.manager.username>admin</cargo.tomcat.manager.username>
<cargo.tomcat.manager.password>1234</cargo.tomcat.manager.password>
</properties>


      值得一提注意的是,本次示例我使用的是同一个Tomcat来让Cargo模拟本地和远程两种方式来发布war。
     因为我们需要部署sample-webapp的快照,把它作为以Cargo方式部署必需的依赖。所以我们在3和4中间都首先要添加对它的依赖。

<dependencies>
<dependency>
<groupId>org.jdonee.cargosample</groupId>
<artifactId>cargosample-webapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>war</type>
</dependency>
</dependencies>


一、部署项目到本地环境

在<build>节点下配置Cargo:
     1)首先配置的是<container>节点,详细描述如下:
<configuration>
<wait>true</wait>
<!--以下标记将详细描述你想要部署的容器-->
<container>
<!--
指定"tomcat6x"这个名称非常的重要!因为它是Cargo中一个完整的标识符,如果你把"x"去掉的话,
而只用"tomcat6"的话,它就不能在Tomcat 6.x下正常工作.
-->
<containerId>tomcat6x</containerId>
<type>installed</type><!-- 本地已安装Tomcat时设置 -->
<home>${catalina.home}</home><!--本地Tomcat安装目录 -->
</container>
......


     2)接下来配置容器的属性,详细描述如下:
<!-- 容器的属性 -->
<configuration>
<!-- 如果你在容器属性中指定类型为"installed"的话,你就必须在如下配置type==existing和重配一次安装目录-->
<type>existing</type>
<home>${catalina.home}</home>
<properties>
<cargo.tomcat.manager.url>
${cargo.tomcat.manager.protocol}://${cargo.tomcat.manager.hostname}:${cargo.tomcat.manager.port}/manager
</cargo.tomcat.manager.url>
<cargo.remote.username>${cargo.tomcat.manager.username}</cargo.remote.username>
<cargo.remote.password>${cargo.tomcat.manager.password}</cargo.remote.password>
<cargo.tomcat.ajp.port>${cargo.tomcat.manager.ajp.port}</cargo.tomcat.ajp.port> <!-- ajp端口,默认8009 -->
</properties>
</configuration>


     当然这里的属性还有很多,如果您想获知更多的参数定义,请点击Tomcat+6x
     3)Cargo有部署的概念,详细操作如下:
 
......
<!-- 准备执行部署 -->
<deployer>
<!-- 类型设置必须跟容器一致 -->
<type>installed</type>
<deployables>
<!--在deployable中指定你要部署的webapp -->
<deployable>
<groupId>${cargo.project.groupid}</groupId>
<artifactId>${cargo.project.artifactid}</artifactId>
<type>war</type>
<!--如果你想重新定义Web应用的名称时设置,大多数情况下你都会定义此属性-->
<properties>
<context>${myproject.name}</context>
</properties>
</deployable>
</deployables>
</deployer>
</configuration>


 注:<deployalbe>中的<groupId>、<artifactId>和<type>必须定义。

     4)Cargo除了可以运行"mvn cargo:deploy"这样的插件目标外,也可执行如clean、install这样的标准阶段目标,大多数时候我们也希望如此,详细操作如下:

<!--运行构建的各个阶段时定义需执行的目标,每个阶段可执行多个目标 -->
<executions>
<execution>
<id>init-container</id><!--初始化容器时先关闭,避免JVM端口被绑定-->
<phase>validate</phase>
<goals><goal>stop</goal></goals>
</execution>
<!--如下的两个阶段主要用于集成测试,如果你只是部署到环境可以忽略它们 -->
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals><goal>deployer-deploy</goal><!--等同于deploy,本地不支持redeploy  --></goals>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals><goal>deployer-undeploy</goal><!--等同于undeploy,本地不支持redeploy  --></goals>
</execution>
<execution><!-- 通过"install"目标部署到容器并运行-->
<id>verify-deploy</id>
<phase>install</phase>
<goals><goal>deployer-deploy</goal><goal>start</goal>
</goals>
</execution>
<execution><!--通过"pre-clean"目标取消部署并关闭容器-->
<id>clean-undeploy</id>
<phase>pre-clean</phase>
<goals><goal>deployer-undeploy</goal><goal>stop</goal>
</goals>
</execution>
</executions>


本地配置完成,你在根pom项目下运行"mvn install"就可以把最新WAR快照部署到Tomcat中运行。

这里有两个值得注意的地方:
  (1)<wait>参数,  如果你设为"true"的话,它会告知你把Tomcat作为Maven构建过程的一部分,然后提示可通过快捷键Ctrl-C或者设置属性wait为false来关闭Session。但是这实际上只是把Tomcat脱离出Maven构建过程而没有真正关闭Tomcat进程。所以你必须再执行"pre-clean"或者"clean"目标来真正关闭它。
  (2)validate目标,我这里首先执行stop操作,如果不定义这个目标的话,重复执行"install"目标会出现JVM端口绑定错误。

二、部署项目到远程环境 

     同样,远程部署同样是在<build>节点下配置Cargo:
     
     1)首先配置的是<container>节点,详细描述如下:

<configuration>
<wait>true</wait>
<!--以下标记将详细描述你想要部署的容器-->
<container>
<!--
指定"tomcat6x"这个名称非常的重要!因为它是Cargo中一个完整的标识符,如果你把"x"去掉的话,
而只用"tomcat6"的话,它就不能在Tomcat 6.x下正常工作.
-->
<containerId>tomcat6x</containerId>
<type>remote</type> <!-- 远程部署类型必须是remote -->
</container>
......


     2)接下来配置容器的属性,详细描述如下:   
   
<configuration>
<!-- 如果你在容器属性中指定类型为"remote"的话,那么你必须在如下配置type==runtime -->
<type>runtime</type>
<properties>
<cargo.hostname>${cargo.tomcat.manager.hostname}</cargo.hostname> <!--主机名,默认localhost -->
<cargo.servlet.port>${cargo.tomcat.manager.port}</cargo.servlet.port> <!-- 端口号,默认值 8080 -->
<cargo.tomcat.manager.url>
${cargo.tomcat.manager.protocol}://${cargo.tomcat.manager.hostname}:${cargo.tomcat.manager.port}/manager
</cargo.tomcat.manager.url>
<cargo.remote.username>${cargo.tomcat.manager.username}</cargo.remote.username>
<cargo.remote.password>${cargo.tomcat.manager.password}</cargo.remote.password>
<cargo.tomcat.ajp.port>${cargo.tomcat.manager.ajp.port}</cargo.tomcat.ajp.port>
</properties>
</configuration>


     3)Cargo远程部署,详细操作如下:

......
<deployer>
<!-- 类型设置必须跟容器一致 -->
<type>remote</type>
<deployables>
<!--在deployable中指定你要部署的webapp -->
<deployable>
<!--可选项,Ping目标地址判断项目地址发布成功或者失败 -->
<pingURL>
${cargo.tomcat.manager.protocol}://${cargo.tomcat.manager.hostname}:${cargo.tomcat.manager.port}/${myproject.name}
</pingURL>
<!--可选项,Ping目标地址的响应时间,默认20000毫秒 -->
<pingTimeout>300000</pingTimeout>
<groupId>${cargo.project.groupid}</groupId>
<artifactId>${cargo.project.artifactid}</artifactId>
<type>war</type>
<properties>
<context>${myproject.name}</context>
</properties>
</deployable>
</deployables>
</deployer>
</configuration>


     4)Cargo执行阶段和目标:

<executions>
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>deployer-redeploy</goal><!--等同于redeploy,本地不支持redeploy -->
</goals>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals>
<goal>deployer-undeploy</goal>
</goals>
</execution>
<execution>
<id>verify-deploy</id>
<phase>install</phase>
<goals>
<goal>deployer-redeploy</goal>
</goals>
</execution>
<execution>
<id>clean-undeploy</id>
<phase>pre-clean</phase>
<goals>
<goal>deployer-undeploy</goal>
</goals>
</execution>
</executions>


     这里需要注意的是执行目标中我使用了redeploy,而不是deploy。这是因为重复执行"install"构建步骤使用deploy会报项目已存在的错误,不利于重复部署,当然你使用"clean install"就没有问题。
     远程配置大体如此,你在根pom项目下运行"mvn install"就可以把最新WAR快照部署到远程Tomcat中运行。

转自:http://jdonee.iteye.com/blog/774387
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maven cargo tomcat