Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/AbstractDeployWarMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/AbstractDeployWarMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployMojo.java?rev=1756441&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployMojo.java
 (added)
+++ 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployMojo.java
 Tue Aug 16 01:03:14 2016
@@ -0,0 +1,37 @@
+package org.apache.tomcat.maven.plugin.tomcat8.deploy;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.plugins.annotations.Execute;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Deploy a WAR to Tomcat.
+ *
+ * @author Mark Hobson <markhob...@gmail.com>
+ */
+@Mojo(name = "deploy", threadSafe = true)
+@Execute(phase = LifecyclePhase.PACKAGE)
+public class DeployMojo
+    extends AbstractDeployWarMojo
+{
+    // no-op : only mojo metadata overriding
+}

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployOnlyMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployOnlyMojo.java?rev=1756441&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployOnlyMojo.java
 (added)
+++ 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployOnlyMojo.java
 Tue Aug 16 01:03:14 2016
@@ -0,0 +1,35 @@
+package org.apache.tomcat.maven.plugin.tomcat8.deploy;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Deploy a WAR to Tomcat without forking the package lifecycle.
+ *
+ * @author olamy
+ * @since 1.0-alpha-2
+ */
+@Mojo(name = "deploy-only", threadSafe = true)
+public class DeployOnlyMojo
+    extends AbstractDeployWarMojo
+{
+    // no-op : only mojo metadata overriding
+}

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployOnlyMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/DeployOnlyMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployMojo.java?rev=1756441&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployMojo.java
 (added)
+++ 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployMojo.java
 Tue Aug 16 01:03:14 2016
@@ -0,0 +1,43 @@
+package org.apache.tomcat.maven.plugin.tomcat8.deploy;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.plugins.annotations.Execute;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Redeploy a WAR in Tomcat.  (Alias for the deploy goal with its update 
parameter set to true.)
+ *
+ * @author Olivier Lamy
+ * @since 2.1
+ */
+@Mojo(name = "redeploy", threadSafe = true)
+@Execute(phase = LifecyclePhase.PACKAGE)
+public class RedeployMojo
+    extends DeployMojo
+{
+    @Override
+    protected boolean isUpdate()
+    {
+        return true;
+    }
+
+}

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployOnlyMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployOnlyMojo.java?rev=1756441&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployOnlyMojo.java
 (added)
+++ 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployOnlyMojo.java
 Tue Aug 16 01:03:14 2016
@@ -0,0 +1,40 @@
+package org.apache.tomcat.maven.plugin.tomcat8.deploy;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.plugins.annotations.Mojo;
+
+/**
+ * Redeploy a WAR in Tomcat without forking the package lifecycle. 
+ * (Alias for the deploy-only goal with its update parameter set to true.)
+ *
+ * @since 2.1
+ */
+@Mojo( name = "redeploy-only", threadSafe = true )
+public class RedeployOnlyMojo
+    extends DeployOnlyMojo
+{
+    @Override
+    protected boolean isUpdate()
+    {
+        return true;
+    }
+
+}

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployOnlyMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/RedeployOnlyMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/UndeployMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/UndeployMojo.java?rev=1756441&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/UndeployMojo.java
 (added)
+++ 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/UndeployMojo.java
 Tue Aug 16 01:03:14 2016
@@ -0,0 +1,84 @@
+package org.apache.tomcat.maven.plugin.tomcat8.deploy;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.tomcat.maven.common.deployer.TomcatManagerException;
+import org.apache.tomcat.maven.common.deployer.TomcatManagerResponse;
+import org.apache.tomcat.maven.plugin.tomcat8.AbstractWarCatalinaMojo;
+
+import java.io.IOException;
+
+/**
+ * Undeploy a WAR from Tomcat.
+ *
+ * @since 2.1
+ */
+@Mojo( name = "undeploy", threadSafe = true )
+public class UndeployMojo
+    extends AbstractWarCatalinaMojo
+{
+    // ----------------------------------------------------------------------
+    // Mojo Parameters
+    // ----------------------------------------------------------------------
+
+    /**
+     * Whether to fail the build if the web application cannot be undeployed.
+     */
+    @Parameter( property = "maven.tomcat.failOnError", defaultValue = "true" )
+    private boolean failOnError;
+
+    // ----------------------------------------------------------------------
+    // Protected Methods
+    // ----------------------------------------------------------------------
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void invokeManager()
+        throws MojoExecutionException, TomcatManagerException, IOException
+    {
+        getLog().info( messagesProvider.getMessage( 
"UndeployMojo.undeployingApp", getDeployedURL() ) );
+
+        try
+        {
+
+            TomcatManagerResponse tomcatResponse = getManager().undeploy( 
getPath() );
+
+            checkTomcatResponse( tomcatResponse );
+
+            log( tomcatResponse.getHttpResponseBody() );
+
+        }
+        catch ( TomcatManagerException e )
+        {
+            if ( failOnError )
+            {
+                throw e;
+            }
+
+            getLog().warn( messagesProvider.getMessage( 
"UndeployMojo.undeployError", e.getMessage() ) );
+        }
+    }
+
+}

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/UndeployMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/deploy/UndeployMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/run/AbstractExecWarMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/run/AbstractExecWarMojo.java?rev=1756441&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/run/AbstractExecWarMojo.java
 (added)
+++ 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/run/AbstractExecWarMojo.java
 Tue Aug 16 01:03:14 2016
@@ -0,0 +1,677 @@
+package org.apache.tomcat.maven.plugin.tomcat8.run;
+/*
+ * 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.
+ */
+
+import org.apache.commons.compress.archivers.ArchiveException;
+import org.apache.commons.compress.archivers.ArchiveOutputStream;
+import org.apache.commons.compress.archivers.ArchiveStreamFactory;
+import org.apache.commons.compress.archivers.jar.JarArchiveEntry;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectHelper;
+import org.apache.tomcat.maven.plugin.tomcat8.AbstractTomcat7Mojo;
+import org.apache.tomcat.maven.runner.Tomcat7Runner;
+import org.apache.tomcat.maven.runner.Tomcat7RunnerCli;
+import org.codehaus.plexus.archiver.jar.Manifest;
+import org.codehaus.plexus.archiver.jar.ManifestException;
+import org.codehaus.plexus.util.DirectoryScanner;
+import org.codehaus.plexus.util.SelectorUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+/**
+ * @author Olivier Lamy
+ * @since 2.0
+ */
+public abstract class AbstractExecWarMojo
+    extends AbstractTomcat7Mojo
+{
+
+    @Parameter( defaultValue = "${project.artifact}", required = true, 
readonly = true )
+    protected Artifact projectArtifact;
+
+    /**
+     * The maven project.
+     */
+    @Parameter( defaultValue = "${project}", required = true, readonly = true )
+    protected MavenProject project;
+
+    @Parameter( defaultValue = "${plugin.artifacts}", required = true )
+    protected List<Artifact> pluginArtifacts;
+
+    @Parameter( defaultValue = "${project.build.directory}" )
+    protected File buildDirectory;
+
+    /**
+     * Path under {@link #buildDirectory} where this mojo may do temporary 
work.
+     */
+    @Parameter( defaultValue = 
"${project.build.directory}/tomcat7-maven-plugin-exec" )
+    private File pluginWorkDirectory;
+
+    @Parameter( property = "maven.tomcat.exec.war.tomcatConf", defaultValue = 
"src/main/tomcatconf" )
+    protected File tomcatConfigurationFilesDirectory;
+
+    @Parameter( defaultValue = "src/main/tomcatconf/server.xml", property = 
"maven.tomcat.exec.war.serverXml" )
+    protected File serverXml;
+
+    /**
+     * Name of the generated exec JAR.
+     */
+    @Parameter( property = "tomcat.jar.finalName",
+                defaultValue = 
"${project.artifactId}-${project.version}-war-exec.jar", required = true )
+    protected String finalName;
+
+    /**
+     * Skip the execution
+     *
+     * @since 2.2
+     */
+    @Parameter( property = "maven.tomcat.skip", defaultValue = "false" )
+    private boolean skip;
+
+    /**
+     * The webapp context path to use for the web application being run.
+     * The name to store webapp in exec jar. Do not use /
+     */
+    @Parameter( property = "maven.tomcat.path", defaultValue = 
"${project.artifactId}", required = true )
+    protected String path;
+
+    @Parameter
+    protected List<WarRunDependency> warRunDependencies;
+
+    @Component
+    protected ArtifactResolver artifactResolver;
+
+    /**
+     * Maven Artifact Factory component.
+     */
+    @Component
+    protected ArtifactFactory artifactFactory;
+
+    /**
+     * Location of the local repository.
+     */
+    @Parameter( defaultValue = "${localRepository}", required = true, readonly 
= true )
+    protected ArtifactRepository local;
+
+    /**
+     * List of Remote Repositories used by the resolver
+     */
+    @Parameter( defaultValue = "${project.remoteArtifactRepositories}", 
required = true, readonly = true )
+    protected List<ArtifactRepository> remoteRepos;
+
+    @Component
+    protected MavenProjectHelper projectHelper;
+
+    /**
+     * Attach or not the generated artifact to the build (use true if you want 
to install or deploy it)
+     */
+    @Parameter( property = "maven.tomcat.exec.war.attachArtifact", 
defaultValue = "true", required = true )
+    protected boolean attachArtifact;
+
+
+    /**
+     * the classifier to use for the attached/generated artifact
+     */
+    @Parameter( property = "maven.tomcat.exec.war.attachArtifactClassifier", 
defaultValue = "exec-war",
+                required = true )
+    protected String attachArtifactClassifier;
+
+
+    /**
+     * the type to use for the attached/generated artifact
+     */
+    @Parameter( property = "maven.tomcat.exec.war.attachArtifactType", 
defaultValue = "jar", required = true )
+    protected String attachArtifactClassifierType;
+
+    /**
+     * to enable naming when starting tomcat
+     */
+    @Parameter( property = "maven.tomcat.exec.war.enableNaming", defaultValue 
= "false", required = true )
+    protected boolean enableNaming;
+
+    /**
+     * see http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html
+     */
+    @Parameter( property = "maven.tomcat.exec.war.accessLogValveFormat", 
defaultValue = "%h %l %u %t %r %s %b %I %D",
+                required = true )
+    protected String accessLogValveFormat;
+
+    /**
+     * list of extra dependencies to add in the standalone tomcat jar: your 
jdbc driver, mail.jar etc..
+     * <b>Those dependencies will be in root classloader.</b>
+     */
+    @Parameter
+    protected List<ExtraDependency> extraDependencies;
+
+    /**
+     * list of extra resources to add in the standalone tomcat jar: your 
logger configuration etc
+     */
+    @Parameter
+    protected List<ExtraResource> extraResources;
+
+    /**
+     * Main class to use for starting the standalone jar.
+     */
+    @Parameter( property = "maven.tomcat.exec.war.mainClass",
+                defaultValue = 
"org.apache.tomcat.maven.runner.Tomcat7RunnerCli", required = true )
+    protected String mainClass;
+
+    /**
+     * which connector protocol to use HTTP/1.1 or 
org.apache.coyote.http11.Http11NioProtocol
+     */
+    @Parameter( property = "maven.tomcat.exec.war.connectorHttpProtocol", 
defaultValue = "HTTP/1.1", required = true )
+    protected String connectorHttpProtocol;
+
+    /**
+     * configure a default http port for the standalone jar
+     *
+     * @since 2.2
+     */
+    @Parameter( property = "maven.tomcat.exec.war.httpPort" )
+    protected String httpPort;
+
+    /**
+     * File patterns to exclude from extraDependencies
+     *
+     * @since 2.2
+     */
+    @Parameter
+    protected String[] excludes;
+
+    public void execute()
+        throws MojoExecutionException, MojoFailureException
+    {
+        if ( this.skip )
+        {
+            getLog().info( "skip execution" );
+            return;
+        }
+        //project.addAttachedArtifact(  );
+        File warExecFile = new File( buildDirectory, finalName );
+        if ( warExecFile.exists() )
+        {
+            warExecFile.delete();
+        }
+
+        File execWarJar = new File( buildDirectory, finalName );
+
+        FileOutputStream execWarJarOutputStream = null;
+        ArchiveOutputStream os = null;
+        File tmpPropertiesFile = null;
+        File tmpManifestFile = null;
+        FileOutputStream tmpPropertiesFileOutputStream = null;
+        PrintWriter tmpManifestWriter = null;
+
+        try
+        {
+
+            tmpPropertiesFile = new File( buildDirectory, 
"war-exec.properties" );
+            if ( tmpPropertiesFile.exists() )
+            {
+                tmpPropertiesFile.delete();
+            }
+            tmpPropertiesFile.getParentFile().mkdirs();
+
+            tmpManifestFile = new File( buildDirectory, "war-exec.manifest" );
+            if ( tmpManifestFile.exists() )
+            {
+                tmpManifestFile.delete();
+            }
+            tmpPropertiesFileOutputStream = new FileOutputStream( 
tmpPropertiesFile );
+            execWarJar.getParentFile().mkdirs();
+            execWarJar.createNewFile();
+            execWarJarOutputStream = new FileOutputStream( execWarJar );
+
+            tmpManifestWriter = new PrintWriter( tmpManifestFile );
+
+            // store :
+            //* wars in the root: foo.war
+            //* tomcat jars
+            //* file tomcat.standalone.properties with possible values :
+            //   * useServerXml=true/false to use directly the one provided
+            //   * enableNaming=true/false
+            //   * wars=foo.war|contextpath;bar.war  ( |contextpath is 
optionnal if empty use the war name )
+            //   * accessLogValveFormat=
+            //   * connectorhttpProtocol: HTTP/1.1 or 
org.apache.coyote.http11.Http11NioProtocol
+            //* optionnal: conf/ with usual tomcat configuration files
+            //* MANIFEST with Main-Class
+
+            Properties properties = new Properties();
+
+            properties.put( Tomcat7Runner.ARCHIVE_GENERATION_TIMESTAMP_KEY,
+                            Long.toString( System.currentTimeMillis() ) );
+            properties.put( Tomcat7Runner.ENABLE_NAMING_KEY, Boolean.toString( 
enableNaming ) );
+            properties.put( Tomcat7Runner.ACCESS_LOG_VALVE_FORMAT_KEY, 
accessLogValveFormat );
+            properties.put( Tomcat7Runner.HTTP_PROTOCOL_KEY, 
connectorHttpProtocol );
+
+            if ( httpPort != null )
+            {
+                properties.put( Tomcat7Runner.HTTP_PORT_KEY, httpPort );
+            }
+
+            os = new ArchiveStreamFactory().createArchiveOutputStream( 
ArchiveStreamFactory.JAR,
+                                                                       
execWarJarOutputStream );
+
+            if ( "war".equals( project.getPackaging() ) )
+            {
+
+                os.putArchiveEntry( new JarArchiveEntry( 
StringUtils.removeStart( path, "/" ) + ".war" ) );
+                IOUtils.copy( new FileInputStream( projectArtifact.getFile() 
), os );
+                os.closeArchiveEntry();
+
+                properties.put( Tomcat7Runner.WARS_KEY, 
StringUtils.removeStart( path, "/" ) + ".war|" + path );
+            }
+            else if ( warRunDependencies != null && 
!warRunDependencies.isEmpty() )
+            {
+                for ( WarRunDependency warRunDependency : warRunDependencies )
+                {
+                    if ( warRunDependency.dependency != null )
+                    {
+                        Dependency dependency = warRunDependency.dependency;
+                        String version = dependency.getVersion();
+                        if ( StringUtils.isEmpty( version ) )
+                        {
+                            version = findArtifactVersion( dependency );
+                        }
+
+                        if ( StringUtils.isEmpty( version ) )
+                        {
+                            throw new MojoExecutionException(
+                                "Dependency '" + dependency.getGroupId() + 
"':'" + dependency.getArtifactId()
+                                    + "' does not have version specified" );
+                        }
+                        Artifact artifact = 
artifactFactory.createArtifactWithClassifier( dependency.getGroupId(),
+                                                                               
           dependency.getArtifactId(),
+                                                                               
           version,
+                                                                               
           dependency.getType(),
+                                                                               
           dependency.getClassifier() );
+
+                        artifactResolver.resolve( artifact, this.remoteRepos, 
this.local );
+
+                        File warFileToBundle = new File( 
resolvePluginWorkDir(), artifact.getFile().getName() );
+                        FileUtils.copyFile( artifact.getFile(), 
warFileToBundle );
+
+                        if ( warRunDependency.contextXml != null )
+                        {
+                            warFileToBundle = addContextXmlToWar( 
warRunDependency.contextXml, warFileToBundle );
+                        }
+                        final String warFileName = 
artifact.getFile().getName();
+                        os.putArchiveEntry( new JarArchiveEntry( warFileName ) 
);
+                        IOUtils.copy( new FileInputStream( warFileToBundle ), 
os );
+                        os.closeArchiveEntry();
+                        String propertyWarValue = properties.getProperty( 
Tomcat7Runner.WARS_KEY );
+                        String contextPath =
+                            StringUtils.isEmpty( warRunDependency.contextPath 
) ? "/" : warRunDependency.contextPath;
+                        if ( propertyWarValue != null )
+                        {
+                            properties.put( Tomcat7Runner.WARS_KEY,
+                                            propertyWarValue + ";" + 
warFileName + "|" + contextPath );
+                        }
+                        else
+                        {
+                            properties.put( Tomcat7Runner.WARS_KEY, 
warFileName + "|" + contextPath );
+                        }
+                    }
+                }
+            }
+
+            if ( serverXml != null && serverXml.exists() )
+            {
+                os.putArchiveEntry( new JarArchiveEntry( "conf/server.xml" ) );
+                IOUtils.copy( new FileInputStream( serverXml ), os );
+                os.closeArchiveEntry();
+                properties.put( Tomcat7Runner.USE_SERVER_XML_KEY, 
Boolean.TRUE.toString() );
+            }
+            else
+            {
+                properties.put( Tomcat7Runner.USE_SERVER_XML_KEY, 
Boolean.FALSE.toString() );
+            }
+
+            os.putArchiveEntry( new JarArchiveEntry( "conf/web.xml" ) );
+            IOUtils.copy( getClass().getResourceAsStream( "/conf/web.xml" ), 
os );
+            os.closeArchiveEntry();
+
+            properties.store( tmpPropertiesFileOutputStream, "created by 
Apache Tomcat Maven plugin" );
+
+            tmpPropertiesFileOutputStream.flush();
+            tmpPropertiesFileOutputStream.close();
+
+            os.putArchiveEntry( new JarArchiveEntry( 
Tomcat7RunnerCli.STAND_ALONE_PROPERTIES_FILENAME ) );
+            IOUtils.copy( new FileInputStream( tmpPropertiesFile ), os );
+            os.closeArchiveEntry();
+
+            // add tomcat classes
+            for ( Artifact pluginArtifact : pluginArtifacts )
+            {
+                if ( StringUtils.equals( "org.apache.tomcat", 
pluginArtifact.getGroupId() ) || StringUtils.equals(
+                    "org.apache.tomcat.embed", pluginArtifact.getGroupId() ) 
|| StringUtils.equals(
+                    "org.eclipse.jdt.core.compiler", 
pluginArtifact.getGroupId() ) || StringUtils.equals( "commons-cli",
+                                                                               
                           pluginArtifact.getArtifactId() )
+                    || StringUtils.equals( "tomcat7-war-runner", 
pluginArtifact.getArtifactId() ) )
+                {
+                    JarFile jarFile = new JarFile( pluginArtifact.getFile() );
+                    extractJarToArchive( jarFile, os, null );
+                }
+            }
+
+            // add extra dependencies
+            if ( extraDependencies != null && !extraDependencies.isEmpty() )
+            {
+                for ( Dependency dependency : extraDependencies )
+                {
+                    String version = dependency.getVersion();
+                    if ( StringUtils.isEmpty( version ) )
+                    {
+                        version = findArtifactVersion( dependency );
+                    }
+
+                    if ( StringUtils.isEmpty( version ) )
+                    {
+                        throw new MojoExecutionException(
+                            "Dependency '" + dependency.getGroupId() + "':'" + 
dependency.getArtifactId()
+                                + "' does not have version specified" );
+                    }
+
+                    // String groupId, String artifactId, String version, 
String scope, String type
+                    Artifact artifact =
+                        artifactFactory.createArtifact( 
dependency.getGroupId(), dependency.getArtifactId(), version,
+                                                        dependency.getScope(), 
dependency.getType() );
+
+                    artifactResolver.resolve( artifact, this.remoteRepos, 
this.local );
+                    JarFile jarFile = new JarFile( artifact.getFile() );
+                    extractJarToArchive( jarFile, os, this.excludes );
+                }
+            }
+
+            Manifest manifest = new Manifest();
+
+            Manifest.Attribute mainClassAtt = new Manifest.Attribute();
+            mainClassAtt.setName( "Main-Class" );
+            mainClassAtt.setValue( mainClass );
+            manifest.addConfiguredAttribute( mainClassAtt );
+
+            manifest.write( tmpManifestWriter );
+            tmpManifestWriter.flush();
+            tmpManifestWriter.close();
+
+            os.putArchiveEntry( new JarArchiveEntry( "META-INF/MANIFEST.MF" ) 
);
+            IOUtils.copy( new FileInputStream( tmpManifestFile ), os );
+            os.closeArchiveEntry();
+
+            if ( attachArtifact )
+            {
+                //MavenProject project, String artifactType, String 
artifactClassifier, File artifactFile
+                projectHelper.attachArtifact( project, 
attachArtifactClassifierType, attachArtifactClassifier,
+                                              execWarJar );
+            }
+
+            if ( extraResources != null )
+            {
+                for ( ExtraResource extraResource : extraResources )
+                {
+
+                    DirectoryScanner directoryScanner = new DirectoryScanner();
+                    directoryScanner.setBasedir( extraResource.getDirectory() 
);
+                    directoryScanner.addDefaultExcludes();
+                    directoryScanner.setExcludes( toStringArray( 
extraResource.getExcludes() ) );
+                    directoryScanner.setIncludes( toStringArray( 
extraResource.getIncludes() ) );
+                    directoryScanner.scan();
+                    for ( String includeFile : 
directoryScanner.getIncludedFiles() )
+                    {
+                        getLog().debug( "include file:" + includeFile );
+                        os.putArchiveEntry( new JarArchiveEntry( includeFile ) 
);
+                        IOUtils.copy( new FileInputStream( new File( 
extraResource.getDirectory(), includeFile ) ),
+                                      os );
+                        os.closeArchiveEntry();
+                    }
+                }
+            }
+
+            if ( tomcatConfigurationFilesDirectory != null && 
tomcatConfigurationFilesDirectory.exists() )
+            {
+                // Because its the tomcat default dir for configs
+                String aConfigOutputDir = "conf/";
+                copyDirectoryContentIntoArchive( 
tomcatConfigurationFilesDirectory, aConfigOutputDir, os );
+            }
+
+        }
+        catch ( ManifestException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( ArchiveException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( ArtifactNotFoundException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new MojoExecutionException( e.getMessage(), e );
+        }
+        finally
+        {
+            IOUtils.closeQuietly( os );
+            IOUtils.closeQuietly( tmpManifestWriter );
+            IOUtils.closeQuietly( execWarJarOutputStream );
+            IOUtils.closeQuietly( tmpPropertiesFileOutputStream );
+        }
+    }
+
+    protected String findArtifactVersion( Dependency dependency )
+    {
+        // search in project.dependencies
+        for ( Dependency projectDependency : (List<Dependency>) 
this.project.getDependencies() )
+        {
+            if ( sameDependencyWithoutVersion( dependency, projectDependency ) 
)
+            {
+                return projectDependency.getVersion();
+            }
+        }
+
+        // search in project.dependencies
+        for ( Dependency projectDependency : (List<Dependency>) 
this.project.getDependencyManagement().getDependencies() )
+        {
+            if ( sameDependencyWithoutVersion( dependency, projectDependency ) 
)
+            {
+                return projectDependency.getVersion();
+            }
+        }
+
+        return null;
+    }
+
+    protected boolean sameDependencyWithoutVersion( Dependency that, 
Dependency dependency )
+    {
+        return StringUtils.equals( that.getGroupId(), dependency.getGroupId() 
) && StringUtils.equals(
+            that.getArtifactId(), dependency.getArtifactId() );
+    }
+
+    protected void copyDirectoryContentIntoArchive( File sourceFolder, String 
destinationPath,
+                                                    ArchiveOutputStream 
archiveOutputStream )
+        throws IOException
+    {
+
+        // Scan the directory
+        DirectoryScanner directoryScanner = new DirectoryScanner();
+        directoryScanner.setBasedir( sourceFolder );
+        directoryScanner.addDefaultExcludes();
+        directoryScanner.scan();
+
+        // Each File
+        for ( String includeFileName : directoryScanner.getIncludedFiles() )
+        {
+            getLog().debug( "include configuration file : " + destinationPath 
+ includeFileName );
+            File inputFile = new File( sourceFolder, includeFileName );
+
+            FileInputStream sourceFileInputStream = null;
+            try
+            {
+                sourceFileInputStream = new FileInputStream( inputFile );
+
+                archiveOutputStream.putArchiveEntry( new JarArchiveEntry( 
destinationPath + includeFileName ) );
+                IOUtils.copy( sourceFileInputStream, archiveOutputStream );
+                archiveOutputStream.closeArchiveEntry();
+            }
+            finally
+            {
+                IOUtils.closeQuietly( sourceFileInputStream );
+            }
+        }
+
+    }
+
+    /**
+     * Resolves the plugin work dir as a sub directory of {@link 
#buildDirectory}, creating it if it does not exist.
+     *
+     * @return File representing the resolved plugin work dir
+     * @throws MojoExecutionException if the plugin work dir cannot be created
+     */
+    protected File resolvePluginWorkDir()
+        throws MojoExecutionException
+    {
+        if ( !pluginWorkDirectory.exists() && !pluginWorkDirectory.mkdirs() )
+        {
+            throw new MojoExecutionException(
+                "Could not create plugin work directory at " + 
pluginWorkDirectory.getAbsolutePath() );
+        }
+
+        return pluginWorkDirectory;
+
+    }
+
+    protected String[] toStringArray( List list )
+    {
+        if ( list == null || list.isEmpty() )
+        {
+            return new String[0];
+        }
+        List<String> res = new ArrayList<String>( list.size() );
+
+        for ( Iterator ite = list.iterator(); ite.hasNext(); )
+        {
+            res.add( (String) ite.next() );
+        }
+        return res.toArray( new String[res.size()] );
+    }
+
+
+    /**
+     * return file can be deleted
+     */
+    protected File addContextXmlToWar( File contextXmlFile, File warFile )
+        throws IOException, ArchiveException
+    {
+        ArchiveOutputStream os = null;
+        OutputStream warOutputStream = null;
+        File tmpWar = File.createTempFile( "tomcat", "war-exec" );
+        tmpWar.deleteOnExit();
+
+        try
+        {
+            warOutputStream = new FileOutputStream( tmpWar );
+            os = new ArchiveStreamFactory().createArchiveOutputStream( 
ArchiveStreamFactory.JAR, warOutputStream );
+            os.putArchiveEntry( new JarArchiveEntry( "META-INF/context.xml" ) 
);
+            IOUtils.copy( new FileInputStream( contextXmlFile ), os );
+            os.closeArchiveEntry();
+
+            JarFile jarFile = new JarFile( warFile );
+            extractJarToArchive( jarFile, os, null );
+            os.flush();
+        }
+        finally
+        {
+            IOUtils.closeQuietly( os );
+            IOUtils.closeQuietly( warOutputStream );
+        }
+        return tmpWar;
+    }
+
+    /**
+     * Copy the contents of a jar file to another archive
+     *
+     * @param file The input jar file
+     * @param os   The output archive
+     * @throws IOException
+     */
+    protected void extractJarToArchive( JarFile file, ArchiveOutputStream os, 
String[] excludes )
+        throws IOException
+    {
+        Enumeration<? extends JarEntry> entries = file.entries();
+        while ( entries.hasMoreElements() )
+        {
+            JarEntry j = entries.nextElement();
+
+            if ( excludes != null && excludes.length > 0 )
+            {
+                for ( String exclude : excludes )
+                {
+                    if ( SelectorUtils.match( exclude, j.getName() ) )
+                    {
+                        continue;
+                    }
+                }
+            }
+
+            if ( StringUtils.equalsIgnoreCase( j.getName(), 
"META-INF/MANIFEST.MF" ) )
+            {
+                continue;
+            }
+            os.putArchiveEntry( new JarArchiveEntry( j.getName() ) );
+            IOUtils.copy( file.getInputStream( j ), os );
+            os.closeArchiveEntry();
+        }
+        if ( file != null )
+        {
+            file.close();
+        }
+    }
+}

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/run/AbstractExecWarMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tomcat/maven-plugin/trunk/tomcat8-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat8/run/AbstractExecWarMojo.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to