 ---
 About Apache Tomcat Maven Plugin
 ---
 Oliver Lamy
 ---
 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

Apache Tomcat Maven Plugin

  This is the new home for the Tomcat Maven Plugin (previously hosted at Codehaus).

  Version ${project.version} has the following new features:

  * Apache Tomcat7 support

  * {{{./executable-war-jar.html}Build an Executable War/Jar}}

  []

  More details in {{{./jira-report.html}Generated changelog from issue tracker}}.

  The Tomcat Maven Plugin provides goals to manipulate WAR projects within the {{{http://tomcat.apache.org/}Apache Tomcat}} servlet container.

  Or to run your war project with an embedded Apache Tomcat. The run goals give you the opportunity to quickly develop your application without needing
  to install a standalone Tomcat instance. More details and features: {{{./run-mojo-features.html}see documentation}}.

* groupId and Mojo name change

  Since version 2.0-beta-1 tomcat mojos has been renamed to tomcat6 and tomcat7 with the same goals.

  You must configure your pom to use this new groupId:

+----------
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>${project.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat8-maven-plugin</artifactId>
          <version>${project.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
+----------

  Or add the groupId in your settings.xml

+----------
  <pluginGroups>
    ....
    <pluginGroup>org.apache.tomcat.maven</pluginGroup>
    ....
  </pluginGroups>
+----------


* Goals Overview


  * {{{./context-goals.html}Goals to manipulate deployed projects within Tomcat}}

  * {{{./container-goals.html}Goals to obtain information from Tomcat}}

  * {{{./executable-war-jar.html}Build an Executable War/Jar}}

  []

* Known limitations

  Some goals are not yet available with the tomcat7 mojo. Those {{{./container-goals.html}container goals}} are available with
  the tomcat6 mojo, you only need to update the manager url in your pom.

  Use <<<http://localhost:8080/manager/text>>> rather than the default tomcat6 url.

