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