 ---
 Tomcat Maven plugin Archetype
 ---
 Oliver Lamy
 ---
 2011-01-13
 ---

 ~~ 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

Tomcat Maven plugin Archetype

  There is an archetype for the Tomcat Maven plugin to show various features with concrete samples.

* Using it

  Use a released version:

+--------------------
mvn archetype:generate \
   -DarchetypeGroupId=org.apache.tomcat.maven \
   -DarchetypeArtifactId=tomcat-maven-archetype \
   -DarchetypeVersion=${project.version}
+--------------------

  Use a SNAPSHOT version:

+--------------------
mvn archetype:generate \
   -DarchetypeGroupId=org.apache.tomcat.maven \
   -DarchetypeArtifactId=tomcat-maven-archetype \
   -DarchetypeVersion=${project.version} \
   -DarchetypeRepository=https://repository.apache.org/content/repositories/snapshots/
+--------------------

  You will have the following output (we will use a project named tomcat-sample)

+--------------------
....
[INFO] Using property: groupId = org.apache.tomcat.maven
Define value for property 'artifactId': : tomcat-sample (project will be created in ./tomcat-sample )
...
cd tomcat-sample
+--------------------

* Project details

  Note: it's a complex hello world sample :-)

  The goal is to expose a REST service called HelloService and use it in a web application.

+------------------
@Path( "HelloService" )
public interface HelloService
{
    @Path( "sayHello/{who}" )
    @GET
    @Produces( { MediaType.TEXT_PLAIN } )
    String sayHello( @PathParam( "who" ) String who );
}
+------------------

  The {{{http://cxf.apache.org}Apache Cxf}} will be used to expose the implementation as a REST service.

  Now you have a standard multi module Maven projects layout:

    * basic-api (service interface)

    * basic-api-impl (service default impl). For more details on how cxf works have a look at spring configuration files.

    * basic-webapp (our webapp module)

    * basic-webapp-exec (module to generated executable war)

    * basic-webapp-it (module to run selenium tests with generated war)

    []

* Using the plugin with the project

** Running the webapp

  From the top directory, you can use: mvn tomcat6:run or mvn tomcat7:run (depends on tomcat version you want).

  Now hit your browser http://localhost:9090 and you will use a very complicated hello world webapp sample

** Integration tests with Selenium

  Use mvn clean install. Default browser is firefox but you can use -Pchrome or -Piexplore.

** Using an executable war/jar

  Now you have now an executable jar/war.

  Try it:

+------------------
cd basic-webapp-exec/target/
java -jar basic-webapp-exec-1.0-SNAPSHOT-war-exec.jar -httpPort 9191
+------------------


  And go to http://localhost:9191 with a browser.

  So you now have a Tomcat 7 instance running this fabulous application without needing to install anything!
