You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2010/08/07 13:39:50 UTC

svn commit: r983213 - in /maven/plugins/trunk/maven-shade-plugin: ./ src/main/java/org/apache/maven/plugins/shade/ src/main/java/org/apache/maven/plugins/shade/filter/ src/main/java/org/apache/maven/plugins/shade/mojo/

Author: bentmann
Date: Sat Aug  7 11:39:49 2010
New Revision: 983213

URL: http://svn.apache.org/viewvc?rev=983213&view=rev
Log:
[MSHADE-84] added support for minijar'ing
Submitted by: Torsten Curdt

Added:
    maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java   (with props)
Modified:
    maven/plugins/trunk/maven-shade-plugin/pom.xml
    maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
    maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/Filter.java
    maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/SimpleFilter.java
    maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java

Modified: maven/plugins/trunk/maven-shade-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/pom.xml?rev=983213&r1=983212&r2=983213&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-shade-plugin/pom.xml Sat Aug  7 11:39:49 2010
@@ -29,7 +29,7 @@ under the License.
   </parent>
 
   <artifactId>maven-shade-plugin</artifactId>
-  <version>1.3.4-SNAPSHOT</version>
+  <version>1.4-SNAPSHOT</version>
   <packaging>maven-plugin</packaging>
 
   <name>Maven Shade Plugin</name>
@@ -110,6 +110,11 @@ under the License.
       <artifactId>maven-dependency-tree</artifactId>
       <version>1.1</version>
     </dependency>
+    <dependency>
+      <groupId>org.vafer</groupId>
+      <artifactId>jdependency</artifactId>
+      <version>0.6</version>
+    </dependency>
 
     <dependency>
       <groupId>junit</groupId>

Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java?rev=983213&r1=983212&r2=983213&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java (original)
+++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java Sat Aug  7 11:39:49 2010
@@ -177,6 +177,12 @@ public class DefaultShader
         }
 
         IOUtil.close( jos );
+
+        for ( Iterator it = filters.iterator(); it.hasNext(); )
+        {
+            Filter filter = (Filter) it.next();
+            filter.finished();
+        }
     }
 
     private JarFile newJarFile( File jar )

Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/Filter.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/Filter.java?rev=983213&r1=983212&r2=983213&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/Filter.java (original)
+++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/Filter.java Sat Aug  7 11:39:49 2010
@@ -29,4 +29,6 @@ public interface Filter
     boolean canFilter( File jar );
 
     boolean isFiltered( String classFile );
+
+    void finished();
 }

Added: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java?rev=983213&view=auto
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java (added)
+++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java Sat Aug  7 11:39:49 2010
@@ -0,0 +1,113 @@
+package org.apache.maven.plugins.shade.filter;
+
+/*
+ * 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 java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.vafer.jdependency.Clazz;
+import org.vafer.jdependency.Clazzpath;
+import org.vafer.jdependency.ClazzpathUnit;
+
+/**
+ * A filter that prevents the inclusion of classes not required in the final jar.
+ * 
+ * @author Torsten Curdt
+ */
+public class MinijarFilter
+    implements Filter
+{
+
+    private Log log;
+
+    private Set removable;
+
+    private int classes_kept;
+
+    private int classes_removed;
+
+    public MinijarFilter( MavenProject project, Log log )
+        throws IOException
+    {
+
+        this.log = log;
+
+        Clazzpath cp = new Clazzpath();
+
+        ClazzpathUnit artifactUnit =
+            cp.addClazzpathUnit( new FileInputStream( project.getArtifact().getFile() ), project.toString() );
+
+        for ( Iterator it = project.getArtifacts().iterator(); it.hasNext(); )
+        {
+            Artifact dependency = (Artifact) it.next();
+
+            InputStream is = null;
+            try
+            {
+                is = new FileInputStream( dependency.getFile() );
+                cp.addClazzpathUnit( is, dependency.toString() );
+            }
+            finally
+            {
+                if ( is != null )
+                    is.close();
+            }
+        }
+
+        removable = cp.getClazzes();
+        removable.removeAll( artifactUnit.getClazzes() );
+        removable.removeAll( artifactUnit.getTransitiveDependencies() );
+    }
+
+    public boolean canFilter( File jar )
+    {
+        return true;
+    }
+
+    public boolean isFiltered( String classFile )
+    {
+        String className = classFile.replace( '/', '.' ).replaceFirst( "\\.class$", "" );
+        Clazz clazz = new Clazz( className );
+
+        if ( removable.contains( clazz ) )
+        {
+            log.info( "Removing " + className );
+            classes_removed += 1;
+            return true;
+        }
+
+        classes_kept += 1;
+        return false;
+    }
+
+    public void finished()
+    {
+        int classes_total = classes_removed + classes_kept;
+        log.info( "Minimized " + classes_total + " -> " + classes_kept + "("
+            + (int) ( 100 * classes_kept / classes_total ) + "%)" );
+    }
+}

Propchange: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/SimpleFilter.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/SimpleFilter.java?rev=983213&r1=983212&r2=983213&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/SimpleFilter.java (original)
+++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/SimpleFilter.java Sat Aug  7 11:39:49 2010
@@ -122,4 +122,7 @@ public class SimpleFilter
         return result;
     }
 
+    public void finished()
+    {
+    }
 }

Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java?rev=983213&r1=983212&r2=983213&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java (original)
+++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java Sat Aug  7 11:39:49 2010
@@ -49,6 +49,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.shade.Shader;
+import org.apache.maven.plugins.shade.filter.MinijarFilter;
 import org.apache.maven.plugins.shade.filter.SimpleFilter;
 import org.apache.maven.plugins.shade.pom.PomWriter;
 import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
@@ -332,6 +333,14 @@ public class ShadeMojo
     private boolean createSourcesJar;
 
     /**
+     * When true, dependencies will be stripped down on the class level
+     * to only the transitive hull required for the artifact.
+     *
+     * @parameter default-value="false"
+     */
+    private boolean minimizeJar;
+
+    /**
      * The path to the output file for the shaded artifact. When this parameter is set, the created archive will neither
      * replace the project's main artifact nor will it be attached. Hence, this parameter causes the parameters
      * {@link #finalName}, {@link #shadedArtifactAttached}, {@link #shadedClassifierName} and
@@ -616,63 +625,75 @@ public class ShadeMojo
     }
 
     private List getFilters()
+        throws MojoExecutionException
     {
         List filters = new ArrayList();
 
-        if ( this.filters == null || this.filters.length <= 0 )
+        if ( this.filters != null && this.filters.length > 0 )
         {
-            return filters;
-        }
-
-        Map artifacts = new HashMap();
+            Map artifacts = new HashMap();
 
-        artifacts.put( project.getArtifact(), new ArtifactId( project.getArtifact() ) );
-
-        for ( Iterator it = project.getArtifacts().iterator(); it.hasNext(); )
-        {
-            Artifact artifact = (Artifact) it.next();
+            artifacts.put( project.getArtifact(), new ArtifactId( project.getArtifact() ) );
 
-            artifacts.put( artifact, new ArtifactId( artifact ) );
-        }
+            for ( Iterator it = project.getArtifacts().iterator(); it.hasNext(); )
+            {
+                Artifact artifact = (Artifact) it.next();
 
-        for ( int i = 0; i < this.filters.length; i++ )
-        {
-            ArchiveFilter filter = this.filters[i];
+                artifacts.put( artifact, new ArtifactId( artifact ) );
+            }
 
-            ArtifactId pattern = new ArtifactId( filter.getArtifact() );
+            for ( int i = 0; i < this.filters.length; i++ )
+            {
+                ArchiveFilter filter = this.filters[i];
 
-            Set jars = new HashSet();
+                ArtifactId pattern = new ArtifactId( filter.getArtifact() );
 
-            for ( Iterator it = artifacts.entrySet().iterator(); it.hasNext(); )
-            {
-                Map.Entry entry = (Map.Entry) it.next();
+                Set jars = new HashSet();
 
-                if ( ( (ArtifactId) entry.getValue() ).matches( pattern ) )
+                for ( Iterator it = artifacts.entrySet().iterator(); it.hasNext(); )
                 {
-                    Artifact artifact = (Artifact) entry.getKey();
-                    
-                    jars.add( artifact.getFile() );
-                    
-                    if ( createSourcesJar )
+                    Map.Entry entry = (Map.Entry) it.next();
+
+                    if ( ( (ArtifactId) entry.getValue() ).matches( pattern ) )
                     {
-                        File file = resolveArtifactSources( artifact );
-                        if ( file != null )
+                        Artifact artifact = (Artifact) entry.getKey();
+
+                        jars.add( artifact.getFile() );
+
+                        if ( createSourcesJar )
                         {
-                            jars.add( file );
+                            File file = resolveArtifactSources( artifact );
+                            if ( file != null )
+                            {
+                                jars.add( file );
+                            }
                         }
                     }
                 }
-            }
 
-            if ( jars.isEmpty() )
-            {
-                getLog().info( "No artifact matching filter " + filter.getArtifact() );
+                if ( jars.isEmpty() )
+                {
+                    getLog().info( "No artifact matching filter " + filter.getArtifact() );
 
-                continue;
+                    continue;
+                }
+
+                filters.add( new SimpleFilter( jars, filter.getIncludes(), filter.getExcludes() ) );
             }
+        }
 
-            filters.add( new SimpleFilter( jars, filter.getIncludes(), filter.getExcludes() ) );
+        if ( minimizeJar )
+        {
+            getLog().info( "Minimizing jar " + project.getArtifact() );
 
+            try
+            {
+                filters.add( new MinijarFilter( project, getLog() ) );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoExecutionException( "Failed to analyze class dependencies", e );
+            }
         }
 
         return filters;