Author: olamy
Date: Tue Oct 11 20:16:43 2011
New Revision: 1182063

URL: http://svn.apache.org/viewvc?rev=1182063&view=rev
Log:
[MTOMCAT-100] support war overlay to add war external dependencies in tomcat 
run.

Added:
    
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculatorRequest.java
   (with props)
Modified:
    tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml
    
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculator.java
    
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/DefaultClassLoaderEntriesCalculator.java
    tomcat/maven-plugin/trunk/pom.xml
    
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java
    
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java
    
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractRunMojo.java
    
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/RunMojo.java

Modified: tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml (original)
+++ tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/pom.xml Tue Oct 11 
20:16:43 2011
@@ -41,6 +41,26 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-archiver</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-archiver</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.tomcat</groupId>
       <artifactId>catalina</artifactId>
       <version>6.0.33</version>
@@ -58,6 +78,12 @@
       <groupId>commons-codec</groupId>
       <artifactId>commons-codec</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+    </dependency>
+
   </dependencies>
 
   <build>

Modified: 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculator.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculator.java?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculator.java
 (original)
+++ 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculator.java
 Tue Oct 11 20:16:43 2011
@@ -32,6 +32,6 @@ import java.util.Set;
  */
 public interface ClassLoaderEntriesCalculator
 {
-    List<String> calculateClassPathEntries( MavenProject mavenProject, 
Set<Artifact> dependencies, Log log )
+    List<String> calculateClassPathEntries( 
ClassLoaderEntriesCalculatorRequest classLoaderEntriesCalculatorRequest )
         throws TomcatRunException;
 }

Added: 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculatorRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculatorRequest.java?rev=1182063&view=auto
==============================================================================
--- 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculatorRequest.java
 (added)
+++ 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/ClassLoaderEntriesCalculatorRequest.java
 Tue Oct 11 20:16:43 2011
@@ -0,0 +1,84 @@
+package org.apache.tomcat.maven.common.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.maven.artifact.Artifact;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+
+import java.util.Set;
+
+/**
+ * @author Olivier Lamy
+ * @since 2.0
+ */
+public class ClassLoaderEntriesCalculatorRequest
+{
+    private MavenProject mavenProject;
+
+    private Set<Artifact> dependencies;
+
+    private Log log;
+
+    private boolean addWarDependenciesInClassloader;
+
+    public MavenProject getMavenProject()
+    {
+        return mavenProject;
+    }
+
+    public ClassLoaderEntriesCalculatorRequest setMavenProject(MavenProject 
mavenProject)
+    {
+        this.mavenProject = mavenProject;
+        return this;
+    }
+
+    public Set<Artifact> getDependencies()
+    {
+        return dependencies;
+    }
+
+    public ClassLoaderEntriesCalculatorRequest setDependencies(Set<Artifact> 
dependencies)
+    {
+        this.dependencies = dependencies;
+        return this;
+    }
+
+    public Log getLog()
+    {
+        return log;
+    }
+
+    public ClassLoaderEntriesCalculatorRequest setLog(Log log)
+    {
+        this.log = log;
+        return this;
+    }
+
+    public boolean isAddWarDependenciesInClassloader()
+    {
+        return addWarDependenciesInClassloader;
+    }
+
+    public ClassLoaderEntriesCalculatorRequest 
setAddWarDependenciesInClassloader(boolean addWarDependenciesInClassloader)
+    {
+        this.addWarDependenciesInClassloader = addWarDependenciesInClassloader;
+        return this;
+    }
+}

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

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

Modified: 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/DefaultClassLoaderEntriesCalculator.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/DefaultClassLoaderEntriesCalculator.java?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/DefaultClassLoaderEntriesCalculator.java
 (original)
+++ 
tomcat/maven-plugin/trunk/common-tomcat-maven-plugin/src/main/java/org/apache/tomcat/maven/common/run/DefaultClassLoaderEntriesCalculator.java
 Tue Oct 11 20:16:43 2011
@@ -19,14 +19,25 @@ package org.apache.tomcat.maven.common.r
  * under the License.
  */
 
+import com.google.common.io.Files;
+import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.archiver.UnArchiver;
+import org.codehaus.plexus.archiver.manager.ArchiverManager;
+import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
 import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.components.io.fileselectors.FileInfo;
+import org.codehaus.plexus.components.io.fileselectors.FileSelector;
 import org.codehaus.plexus.util.StringUtils;
 
 import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -40,7 +51,12 @@ import java.util.Set;
 public class DefaultClassLoaderEntriesCalculator
     implements ClassLoaderEntriesCalculator
 {
-    public List<String> calculateClassPathEntries( MavenProject project, 
Set<Artifact> dependencies, Log log )
+
+    @Requirement
+    private ArchiverManager archiverManager;
+
+
+    public List<String> calculateClassPathEntries( 
ClassLoaderEntriesCalculatorRequest request )
         throws TomcatRunException
     {
         List<String> classLoaderEntries = new ArrayList<String>();
@@ -48,7 +64,8 @@ public class DefaultClassLoaderEntriesCa
 
         try
         {
-            @SuppressWarnings( "unchecked" ) List<String> classPathElements = 
project.getCompileClasspathElements();
+            @SuppressWarnings( "unchecked" ) List<String> classPathElements =
+                request.getMavenProject().getCompileClasspathElements();
             if ( classPathElements != null )
             {
                 for ( String classPathElement : classPathElements )
@@ -56,7 +73,7 @@ public class DefaultClassLoaderEntriesCa
                     File classPathElementFile = new File( classPathElement );
                     if ( classPathElementFile.exists() && 
classPathElementFile.isDirectory() )
                     {
-                        log.debug( "adding classPathElementFile " + 
classPathElementFile.toURI().toString() );
+                        request.getLog().debug("adding classPathElementFile " 
+ classPathElementFile.toURI().toString());
                         classLoaderEntries.add( 
classPathElementFile.toURI().toString() );
                     }
                 }
@@ -68,31 +85,86 @@ public class DefaultClassLoaderEntriesCa
         }
 
         // add artifacts to loader
-        if ( dependencies != null )
+        if ( request.getDependencies() != null )
         {
-            for ( Artifact artifact : dependencies )
+            for ( Artifact artifact : request.getDependencies() )
             {
                 String scope = artifact.getScope();
 
                 // skip provided and test scoped artifacts
                 if ( !Artifact.SCOPE_PROVIDED.equals( scope ) && 
!Artifact.SCOPE_TEST.equals( scope ) )
                 {
-                    log.debug(
+                    request.getLog().debug(
                         "add dependency to webapploader " + 
artifact.getGroupId() + ":" + artifact.getArtifactId() + ":"
-                            + artifact.getVersion() + ":" + 
artifact.getScope() );
-                    if ( !isInProjectReferences( artifact, project ) )
+                            + artifact.getVersion() + ":" + 
artifact.getScope());
+                    if ( !isInProjectReferences( artifact, 
request.getMavenProject() ) )
                     {
                         classLoaderEntries.add( 
artifact.getFile().toURI().toString() );
                     }
                     else
                     {
-                        log.debug( "skip adding artifact " + 
artifact.getArtifactId() + " as it's in reactors" );
+                        request.getLog().debug(
+                            "skip adding artifact " + artifact.getArtifactId() 
+ " as it's in reactors");
+                    }
+                }
+                // in case of war dependency we must add /WEB-INF/lib/*.jar in 
entries and WEB-INF/classes
+                if ("war".equals(artifact.getType())  && 
request.isAddWarDependenciesInClassloader() )
+                {
+                    File tmpDir = null;
+                    try
+                    {
+                        tmpDir = Files.createTempDir();
+                        File warFile = artifact.getFile();
+                        UnArchiver unArchiver = archiverManager.getUnArchiver( 
"jar" );
+                        unArchiver.setSourceFile( warFile );
+                        unArchiver.setDestDirectory(tmpDir);
+                        unArchiver.extract();
+                        File libsDirectory = new File( tmpDir, "WEB-INF/lib" );
+                        if (libsDirectory.exists())
+                        {
+                            String[] jars = libsDirectory.list( new 
FilenameFilter()
+                            {
+                                public boolean accept(File file, String s)
+                                {
+                                    return  s.endsWith( ".jar" );
+                                }
+                            } );
+                            for (String jar : jars)
+                            {
+                                classLoaderEntries.add( new File( jar 
).toURI().toString() );
+                            }
+                        }
+                        File classesDirectory = new File( tmpDir, 
"WEB-INF/classes" );
+                        if (classesDirectory.exists())
+                        {
+                            classLoaderEntries.add( 
classesDirectory.toURI().toString() );
+                        }
+                    } catch ( NoSuchArchiverException e)
+                    {
+                        throw new TomcatRunException(e.getMessage(), e);
+                    } catch ( ArchiverException e) {
+                        request.getLog().error(
+                            "fail to extract war file " + artifact.getFile() + 
", reason:" + e.getMessage(), e);
+                        throw new TomcatRunException(e.getMessage(), e);
+                    } finally {
+                        deleteDirectory( tmpDir, request.getLog() );
                     }
                 }
             }
         }
         return classLoaderEntries;
     }
+    
+    private void deleteDirectory(File directory, Log log) throws 
TomcatRunException
+    {
+        try
+        {        
+            FileUtils.deleteDirectory(directory);
+        } catch ( IOException e) {
+            log.error( "fail to delete directory file " + directory + ", 
reason:" + e.getMessage(), e );
+            throw new TomcatRunException(e.getMessage(), e);
+        }            
+    }
 
     protected boolean isInProjectReferences( Artifact artifact, MavenProject 
project )
     {

Modified: tomcat/maven-plugin/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/pom.xml?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- tomcat/maven-plugin/trunk/pom.xml (original)
+++ tomcat/maven-plugin/trunk/pom.xml Tue Oct 11 20:16:43 2011
@@ -253,7 +253,12 @@
       <dependency>
         <groupId>org.apache.maven</groupId>
         <artifactId>maven-archiver</artifactId>
-        <version>2.2</version>
+        <version>2.4.2</version>
+      </dependency>
+      <dependency>
+        <groupId>org.codehaus.plexus</groupId>
+        <artifactId>plexus-archiver</artifactId>
+        <version>2.0.1</version>
       </dependency>
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
@@ -266,10 +271,25 @@
         <version>1.3</version>
       </dependency>
       <dependency>
+        <groupId>commons-io</groupId>
+        <artifactId>commons-io</artifactId>
+        <version>2.0.1</version>
+      </dependency>
+      <dependency>
+        <groupId>commons-lang</groupId>
+        <artifactId>commons-lang</artifactId>
+        <version>2.6</version>
+      </dependency>
+      <dependency>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-classworlds</artifactId>
         <version>2.2.2</version>
       </dependency>
+      <dependency>
+        <groupId>com.google.guava</groupId>
+        <artifactId>guava</artifactId>
+        <version>10.0.1</version>
+      </dependency>
 
       <!-- Test Dependencies -->
 

Modified: 
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java
 (original)
+++ 
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/AbstractRunMojo.java
 Tue Oct 11 20:16:43 2011
@@ -883,11 +883,6 @@ public abstract class AbstractRunMojo
                         // Extract the module
                         unArchiver.extract( );
                     }
-                    catch ( IOException e )
-                    {
-                        getLog( ).error( e );
-                        continue;
-                    }
                     catch ( NoSuchArchiverException e )
                     {
                         getLog( ).error( e );

Modified: 
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java
 (original)
+++ 
tomcat/maven-plugin/trunk/tomcat6-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat6/RunMojo.java
 Tue Oct 11 20:16:43 2011
@@ -25,6 +25,7 @@ import org.apache.catalina.startup.Embed
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.tomcat.maven.common.run.ClassLoaderEntriesCalculator;
+import org.apache.tomcat.maven.common.run.ClassLoaderEntriesCalculatorRequest;
 import org.apache.tomcat.maven.common.run.TomcatRunException;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
@@ -138,9 +139,10 @@ public class RunMojo
 
         try
         {
-
+            ClassLoaderEntriesCalculatorRequest request =
+                new ClassLoaderEntriesCalculatorRequest().setDependencies( 
dependencies ).setLog( getLog() ).setMavenProject( project );
             List<String> classLoaderEntries =
-                
classLoaderEntriesCalculator.calculateClassPathEntries(project, dependencies, 
getLog());
+                
classLoaderEntriesCalculator.calculateClassPathEntries(request);
 
             if ( classLoaderEntries != null )
             {

Modified: 
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractRunMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractRunMojo.java?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractRunMojo.java
 (original)
+++ 
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/AbstractRunMojo.java
 Tue Oct 11 20:16:43 2011
@@ -905,11 +905,6 @@ public abstract class AbstractRunMojo
                         // Extract the module
                         unArchiver.extract();
                     }
-                    catch ( IOException e )
-                    {
-                        getLog().error(e);
-                        continue;
-                    }
                     catch ( NoSuchArchiverException e )
                     {
                         getLog().error(e);

Modified: 
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/RunMojo.java
URL: 
http://svn.apache.org/viewvc/tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/RunMojo.java?rev=1182063&r1=1182062&r2=1182063&view=diff
==============================================================================
--- 
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/RunMojo.java
 (original)
+++ 
tomcat/maven-plugin/trunk/tomcat7-maven-plugin/src/main/java/org/apache/tomcat/maven/plugin/tomcat7/run/RunMojo.java
 Tue Oct 11 20:16:43 2011
@@ -22,6 +22,7 @@ import org.apache.catalina.loader.Webapp
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.tomcat.maven.common.run.ClassLoaderEntriesCalculator;
+import org.apache.tomcat.maven.common.run.ClassLoaderEntriesCalculatorRequest;
 import org.apache.tomcat.maven.common.run.TomcatRunException;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
@@ -97,6 +98,14 @@ public class RunMojo
      */
     private ClassLoaderEntriesCalculator classLoaderEntriesCalculator;
 
+    /**
+     * FIXME javadoc
+     *
+     * @parameter expression="${maven.tomcat.addWarDependenciesInClassloader}" 
default-value="false"
+     * @since 2.0
+     */
+    private boolean addWarDependenciesInClassloader;
+
     private File temporaryContextFile = null;
 
     /**
@@ -199,9 +208,12 @@ public class RunMojo
 
         try
         {
-
+            ClassLoaderEntriesCalculatorRequest request =
+                new ClassLoaderEntriesCalculatorRequest().setDependencies( 
dependencies )
+                    .setLog( getLog() ).setMavenProject( project )
+                    .setAddWarDependenciesInClassloader( 
addWarDependenciesInClassloader );
             List<String> classLoaderEntries =
-                
classLoaderEntriesCalculator.calculateClassPathEntries(project, dependencies, 
getLog());
+                
classLoaderEntriesCalculator.calculateClassPathEntries(request);
 
             if ( classLoaderEntries != null )
             {



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

Reply via email to