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

The generated standalone jar will contains:
* wars in the root: foo.war
* tomcat classes in jar
* file tomcat.standalone.properties with possible values :
   * useServerXml=true/false to use directly the one provided
     in the maven plugin configuration
   * wars=foo.war|contextpath;bar.war  ( |contextpath is optionnal if empty use the war name)
   * enableNaming=true/false
   * accessLogValveFormat=
   * connectorhttpProtocol: HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol

* optionnal: conf/ with usual tomcat configuration files

On start:
1. create a .extract directory with all the tomcat configuration
2. check if -serverXml is set: if yes use it
 2.1. check in tomcat.standalone.properties if useServerXml=true
      if use extract it to .extract/conf and use it with
      other files located in /conf  (except if .extract already here )
 2.2. if not use data from cli: -httpPort, -httpsPort, -ajpPort
3. now extract wars to .extract/webapps/ (except if .extract already here )
4. start Tomcat embded with necessary configuration and add webapps.
