`
lovefly_zero
  • 浏览: 390445 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

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

阅读更多

 

一、引言

      朋友,也许你也已经使用Maven有一段时间了,你已得益于Maven优美的管理方式,但是常常因为构建webapp而需手动发布到Tomcat而发愁。当然,你也有想到过通过脚本、FTP或者SSH的方式发布一个的最新WAR快照到Tomcat,对,这么做也不失为一种解决办法。但你也可能会想有没有更优雅的通过Maven插件来做到这一点吗?答案是肯定的,我找到了两个相关的插件-----Tomcat Maven pluginCargo plugin

     我首先试用了Tomcat Maven plugin,但我发现它实际上把项目部署到自己的Tomcat实例,而我想要的通过嵌入式的方式把项目发布到我本地的Tomcat,而不需要一个新的实例,所以我放弃了它。

      所以我回来来找 Cargo plugin,发现它正是我想要的,但是它的帮助文档让我抓狂,去看过的朋友估计和我有一样感同深受。不过,通过看它的文档,也锻炼我的耐心,经过一番周折,我部署成功了,所以我把它们贡献出来,和大家一起分享。

 

二、教程必需条件

      环境:Windows XP SP2及以上

      工具要求:apache-maven-3.0-beta-2、Tomcat6.0.29

      插件要求:cargo-maven2-plugin(Maven)

      本文章将引导你如何通过使用Maven Cargo 插件把一个Web应用程序发布到Tomcat6。Cargo是一个基于标准方式发布Web应用程序到Java EE容器的瘦包装器,它能发布到多种Web服务器,如GeronimoGlassfishJBossTomcatJettyWebLogic等。

      Cargo包含如下工具和API

  •  
    •   启动/停止/配置Java容器和部署模块到Java容器的API。
    •  解析/创建/合并Java EE模块的API。
    •   Ant 任务, Maven 1 Maven 2 插件。
    •   以插件形式集成在Intellij IDEA Netbeans中。

      你可以通过配置您的pom.xml来决定您是否需要本地或者远程部署到您的tomcat服务器。

      我的用例很简单,就是把一个Web项目发布到本地或者远程Tomcat环境。

             下面包含了我本次教程的结构示例(呵呵,不算标准哟,大家自己扩充)

  •  
    • cargosample-parent

      • pom.xml 1
      • cargosample-webapp
        • pom.xml 2
      • cargosample-deployer-local
        • pom.xml 3
      • cargosample-deployer-remote
        • pom.xml 4

 

        1、这是根pom,这里不会做有关于Cargo的操作,但是它包含了所有的子模块和Cargo所要用到的公共属性。

        下面是该文件中关于跟Cargo有关的自定义属性的描述:

<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.protocol>http</cargo.tomcat.manager.protocol>
		<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>
 

 

 

            2、这个pom包含web应用模块的描述和依赖关系

       3、这个pom包含发布项目到本地Tomcat,是本实例的重点之一。

       4、这个pom包含发布项目到远程Tomcat

值得一提注意的是,本次示例我使用的是同一个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"这样的插件目标外,也可执行如cleaninstall这样的标准阶段目标,大多数时候我们也希望如此,详细操作如下:

   

 

<!--运行构建的各个阶段时定义需执行的目标,每个阶段可执行多个目标 -->
				<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或者设置属性waitfalse来关闭Session。但是这实际上只是把Tomcat脱离出Maven构建过程而没有真正关闭Tomcat进程。所以你必须再执行"pre-clean"或者"clean"目标来真正关闭它。

  (2)validate目标,我这里首先执行stop操作,如果不定义这个目标的话,重复执行"install"目标会出现JVM端口绑定错误。

 

四、部署项目到远程环境

       同样,远程部署同样是在<build>节点下配置Cargo

        1)首先配置的是<container>节点,详细描述如下:

 

<configuration>
					<wait>true</wait>
					<container>
						<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中运行。

 

五、运用反应堆模式灵活部署项目

          细心的朋友马上就会发现,为什么在单独执行"mvn clean"或者"mvn install"有时候会出错,而且我们使用测试错误的主要原因很多,但是使用同一个Tomcat或者远程Tomcat关闭的时候就会构建就会出现很多问题。

如果我们希望两个模块相处融洽的话,那么最好加入反应堆控制。

比如我想只需要执行本地部署:

clean install -pl cargosample-deployer-local/ -am

同样只执行远程部署:

clean install -pl cargosample-deployer-remote/ -am

关于反应堆的更过信息,请点击按需构建多模块,玩转Maven反应堆

 

六、通过定义profile文件的方式部署

         如果涉及团队开发的话,parent pom文件中的属性不见得都适用,让每个成员灵活定义自己的属性就显得尤为重要。

         剪切父pom文件中关于cargo 配置的部分,并在settings中定义一个属于Cargoprofile文件添加如下文本并自动激活它,当然你也可已选择手动激活,关于手动激活请参阅激活Maven profile的方式

 

 <profile>  
       <id>cargo</id>  
	   <activation>  
           <activeByDefault>true</activeByDefault>  
       </activation> 
       <properties>  
        <!--可单独提取并配置到profiles文件来激活 -->
		<catalina.home>${env.CATLINA_HOME}</catalina.home><!--D:\hudson_ci\hudson_dep_tools\Tomcat6.0-->
		<cargo.tomcat.manager.protocol>http</cargo.tomcat.manager.protocol>
		<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>  
</profile> 
 

 

不要忘了激活它。

 

<activeProfiles>
	  <activeProfile>cargo</activeProfile>  
</activeProfiles>  
 

 

再执行"clean install",同样大功告成。

 

关于通过Cargo部署项目到Tomcat就暂时写到这里,如果您有什么好的建议,欢迎指出。

下一部分,将写到如何利用Hudson持续部署项目。

        

七、其它参考资料

 

1http://www.waltercedric.com/java-j2ee-mainmenu-53/361-maven-build-system/1555-deploy-to-tomcat-6-using-maven.html

2http://dpillay.wordpress.com/2009/04/12/maven-cargo-tomcat-auto-deployment/

11
0
分享到:
评论
8 楼 macrotea 2013-05-14  
1.4.0有所不同,我都是看官网文档的
7 楼 melin 2012-02-25  
cargo tomcat 能够支持守护进程运行?
6 楼 kisseveryone 2011-11-03  
又什么能用到开发环境的!
1.eclipse控制台可以看到tomcat日志
2.支持代码实时调试
3.支持自定义部署路径 ,比如 /
5 楼 lovefly_zero 2011-06-23  
381234609 写道
thanks  share article
但是发布tomcat后   再次修改项目代码不能更新
  请问应该如何解决
谢谢

这种场合其实只适合部署环境,不适合开发环境。
4 楼 381234609 2011-03-15  
thanks  share article


但是发布tomcat后   再次修改项目代码不能更新

  请问应该如何解决


谢谢
3 楼 lovefly_zero 2010-12-13  
tomcat-maven-plugin
raosiyong 写道
在tomcat 7的deploy

在pom.xml中加上:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8080/manager/html</url>
<username>${tomcat.manager.username}</username>
<password>${tomcat.manager.password}</password>
</configuration >
</plugin>

另在tomcat 7.x conf/tomcat-users.xml中加上username和password的设置。注意:
   <user username="XXX" password="XXXXXX" roles="manager-gui,manager-status,manager-script" />

后remote deploy成功。

谢谢你前面的文章。



关于tomcat-maven-plugin 插件如我文章所说,不是我需要的。同理Cargo也支持本地部署Tomcat7.x 没有必要再使用它。
2 楼 lovefly_zero 2010-12-12  

多谢。
1 楼 raosiyong 2010-12-10  
在tomcat 7的deploy

在pom.xml中加上:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8080/manager/html</url>
<username>${tomcat.manager.username}</username>
<password>${tomcat.manager.password}</password>
</configuration >
</plugin>

另在tomcat 7.x conf/tomcat-users.xml中加上username和password的设置。注意:
   <user username="XXX" password="XXXXXX" roles="manager-gui,manager-status,manager-script" />

后remote deploy成功。

谢谢你前面的文章。

相关推荐

    maven cargo自动化部署tomcat7.pdf

    通过以上知识点,可以看出在Maven下使用Cargo插件实现自动化部署Tomcat7的过程是相对复杂的,涉及到对Maven、Cargo、Tomcat以及它们配置的深入理解。配置正确的POM文件、Tomcat服务器权限和Maven全局设置是保证部署...

    maven-tomcat自动部署

    除了上述插件,还可以使用Maven的Cargo插件或者Jenkins等自动化工具实现更复杂的部署策略,如热更新、滚动更新等。这些工具和插件使得开发者能够专注于编写代码,而无需担心部署过程中的繁琐操作。 总结来说,Maven...

    tomcat7,8,maven

    - **Cargo插件**:Cargo提供更灵活的容器管理,包括远程部署到生产环境的Tomcat服务器。 5. **Maven生命周期与构建过程**: - **clean**:清理项目目标目录,如target。 - **compile**:编译源代码为字节码。 -...

    Jenkins+Maven+svn+Tomcat入门文档

    Cargo插件是一个Maven插件,可以用于自动化部署Web应用程序到各种Web容器中,如Tomcat、Jetty等。 **使用WebLogicMavenPlugin插件自动化部署weblogic** WebLogicMavenPlugin插件用于自动化部署Web应用程序到Oracle...

    cargo远程部署web项目资料

    在pom.xml文件中,你需要添加Cargo插件的配置,包括目标容器(如Tomcat)、部署的目标URL、部署的WAR文件路径等。例如: ```xml &lt;groupId&gt;org.codehaus.cargo &lt;artifactId&gt;cargo-maven2-plugin ...

    Cargo实现自动化部署

    使用cargo-maven2-plugin插件配置Tomcat本地自动发布 .

    maven架构工程

    Cargo插件 ** Cargo是一款Maven插件,用于自动化Web应用的部署和管理。它可以与多种应用服务器(如Tomcat、Jetty等)集成,支持启动、停止、部署、undeploy等操作。在多WAR部署场景下,Cargo能帮助我们便捷地管理...

    maven_web.txt

    根据提供的`maven_web.txt`文件内容,我们可以看到这是一个Maven配置文件的一部分,主要涉及到了如何使用`cargo-maven2-plugin`插件来实现Web应用的自动部署。 #### 核心配置解读 1. **`&lt;finalName&gt;`**: 这个标签...

    201205_Maven学习笔记1.rar

    3. [20120524]maven发布web项目到jetty和cargo部署到tomcat.doc:这份文档可能会讲解如何使用Maven插件(如Jetty Maven Plugin和Cargo Maven Plugin)自动化部署Web应用程序到Jetty或Tomcat服务器。Maven插件扩展了...

    myhippoproject:河马CMS示例项目

    该项目使用 Maven Cargo 插件在 Tomcat 中本地运行 Essentials、CMS 和站点。 从项目根文件夹,执行: mvn clean verify mvn -P cargo.run 在访问 Hippo Essentials。 设置项目后,通过访问 CMS 和。 日志位于 ...

    尚硅谷学习笔记+代码,Maven 教程

    尚硅谷学习笔记+代码,Maven 教程 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具 ...部署 war 包:借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器上

    java热部署工具

    6. **Maven插件**: Maven的Cargo插件也可以用于自动化JBoss的部署,包括热部署。开发者可以在构建脚本中配置Cargo,使其在编译完成后自动部署到JBoss服务器。 热部署虽然带来了便利,但也需要注意一些潜在问题,...

    gradle-cargo-plugin:Gradle插件,可通过Cargo为本地和远程容器提供部署功能

    Gradle Cargo Plugin是一款强大的构建工具Gradle的插件,它集成了Cargo库,使得开发者能够方便地对Web应用程序进行本地和远程的部署操作。Cargo是一款非常实用的Java应用部署工具,支持多种应用服务器,如Tomcat、...

    deploy.rar

    使用该插件,首先需要在项目中集成Cargo,这可以通过Maven、Gradle等构建工具的插件配置实现。然后,在项目的配置文件中设定远程服务器的相关信息,如IP地址、端口号、用户名、密码以及目标容器类型等。一旦设置完成...

    Java Power Tools

    Cargo是Maven的一个插件,用于简化应用在容器中的部署过程。通过Cargo,开发者可以轻松地将应用部署到Tomcat、Jetty等主流应用服务器上。 **2.16/17 在Eclipse/NetBeans中使用Maven** Maven与Eclipse和NetBeans等...

    codehaus-cargo.github.io:Codehaus Cargo网站

    Maven2 / Maven3插件包装了Java API,用于将应用程序配置,启动,停止和部署到所有受支持的容器,以及解析,创建和合并J2EE / Java EE模块。 这些工具和API可以独立使用,也可以通过各种IDE使

    blog-ui-testing-container:回购

    我们仍然依靠maven-cargo-plugin将战争部署到Tomcat (或我们选择的任何Web应用程序容器)。 我们在旁边添加了pippo-demo.war文件,以便于尝试。 在实际情况下,它将在另一步骤中构建,并且可能由Jenkins将其复制到...

    Group_2_Programming_Ex_project

    3. Maven Tomcat部署 转到服务器的文件夹: cd server 。 编译项目: mvn package 。 通过货运插件通过以下方式解除mvn cargo:deploy : mvn cargo:deploy 。 通过从Tomcat目录运行startup.bat来运行Tomcat的...

Global site tag (gtag.js) - Google Analytics