 ---
 Context Goals
 ---
 Mark Hobson
 <markhobson@gmail.com>
 ---
 2011-01-10
 ---

 ~~ Licensed to the Apache Software Foundation (ASF) under one
 ~~ or more contributor license agreements.  See the NOTICE file
 ~~ distributed with this work for additional information
 ~~ regarding copyright ownership.  The ASF licenses this file
 ~~ to you under the Apache License, Version 2.0 (the
 ~~ "License"); you may not use this file except in compliance
 ~~ with the License.  You may obtain a copy of the License at
 ~~
 ~~   http://www.apache.org/licenses/LICENSE-2.0
 ~~
 ~~ Unless required by applicable law or agreed to in writing,
 ~~ software distributed under the License is distributed on an
 ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 ~~ KIND, either express or implied.  See the License for the
 ~~ specific language governing permissions and limitations
 ~~ under the License.

 ~~ NOTE: For help with the syntax of this file, see:
 ~~ http://maven.apache.org/doxia/references/apt-format.html

Context Goals

 This plugin provides goals that perform various tasks on your project's context
 once deployed on Tomcat:

 * {{{#Redeploying a WAR project}Redeploying a WAR project}}

 * {{{#Undeploying a WAR project}Undeploying a WAR project}}

 * {{{#Starting a WAR project}Starting a WAR project}}

 * {{{#Stopping a WAR project}Stopping a WAR project}}

 * {{{#Listing session statistics}Listing session statistics}}

 []

 These are described in more detail below.

* {Redeploying a WAR project}

 The goals required to redeploy a WAR project depend upon how it was deployed:

 * To redeploy a WAR project deployed by <<<tomcat:deploy>>> you can type:

+--
mvn package tomcat6/7:redeploy
+--

 * To redeploy a WAR project deployed by <<<tomcat:exploded>>> you can type:

+--
mvn war:exploded tomcat6/7:redeploy
+--

 * To redeploy a WAR project deployed by <<<tomcat:inplace>>> you can type:

+--
mvn war:inplace tomcat6/7:redeploy
+--

 * To redeploy a context.xml file deployed by <<<tomcat:deploy>>> you can type:

+--
mvn tomcat6/7:redeploy
+--

 <<Note:>> Depending on the <<<docBase>>> specified in the <<<context.xml>>> you
 may also need to call <<<war:exploded>>> or <<<war:inplace>>> as above.

* {Undeploying a WAR project}

 To undeploy a WAR from Tomcat you can type:

+--
mvn tomcat6/7:undeploy
+--

* {Starting a WAR project}

 To start a WAR in Tomcat you can type:

+--
mvn tomcat6:start
+--

* {Stopping a WAR project}

 To stop a WAR in Tomcat you can type:

+--
mvn tomcat6:stop
+--

* {Listing session statistics}

 To list the session statistics for a deployed WAR project you can type:

+--
mvn tomcat6:sessions
+--
