You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by bi...@apache.org on 2012/05/28 03:15:51 UTC

svn commit: r1343123 - in /maven/plugins/trunk/maven-shade-plugin/src: it/mini-jar-malformed-dependencies/ it/mini-jar-malformed-dependencies/pom.xml main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java

Author: bimargulies
Date: Mon May 28 01:15:51 2012
New Revision: 1343123

URL: http://svn.apache.org/viewvc?rev=1343123&view=rev
Log:
MSHADE-107: ArrayIndexOutOfBoundsException when using minimizeJar with shade plugin
 o accepted patch that improved the diagnostics for bad dependencies.

Added:
    maven/plugins/trunk/maven-shade-plugin/src/it/mini-jar-malformed-dependencies/
    maven/plugins/trunk/maven-shade-plugin/src/it/mini-jar-malformed-dependencies/pom.xml
Modified:
    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/it/mini-jar-malformed-dependencies/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/it/mini-jar-malformed-dependencies/pom.xml?rev=1343123&view=auto
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/it/mini-jar-malformed-dependencies/pom.xml (added)
+++ maven/plugins/trunk/maven-shade-plugin/src/it/mini-jar-malformed-dependencies/pom.xml Mon May 28 01:15:51 2012
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.shade</groupId>
+  <artifactId>mini-jar-malformed-dependencies-MSHADE-107</artifactId>
+  <version>1</version>
+  <name>mini-jar-malformed-dependencies-MSHADE-107</name>
+
+  <dependencies>  
+    <!-- dependencies with "malformed classes" that break asm's ClassReader -->
+    <!-- see also http://jira.codehaus.org/browse/MANIMALSNIFFER-9 -->
+    <dependency>
+        <groupId>jaxen</groupId>
+        <artifactId>jaxen</artifactId>
+        <version>1.1.1</version>
+    </dependency>
+    <dependency>
+        <groupId>com.ibm.icu</groupId>
+        <artifactId>icu4j</artifactId>
+        <version>2.6.1</version>
+    </dependency>  
+  </dependencies>
+
+    <build> 
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>@project.version@</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>                        
+                        <configuration>
+                            <minimizeJar>true</minimizeJar>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>    
+</project>
\ No newline at end of file

Modified: 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=1343123&r1=1343122&r2=1343123&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java (original)
+++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/filter/MinijarFilter.java Mon May 28 01:15:51 2012
@@ -19,14 +19,6 @@ package org.apache.maven.plugins.shade.f
  * under the License.
  */
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.IOUtil;
-import org.vafer.jdependency.Clazz;
-import org.vafer.jdependency.Clazzpath;
-import org.vafer.jdependency.ClazzpathUnit;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -37,6 +29,14 @@ import java.util.Iterator;
 import java.util.List;
 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.codehaus.plexus.util.IOUtil;
+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.
  *
@@ -48,7 +48,7 @@ public class MinijarFilter
 
     private Log log;
 
-    private Set removable;
+    private Set<Clazz> removable;
 
     private int classesKept;
 
@@ -64,6 +64,7 @@ public class MinijarFilter
      *
      * @since 1.6
      */
+    @SuppressWarnings( { "unchecked", "rawtypes" } )
     public MinijarFilter( MavenProject project, Log log, List<SimpleFilter> simpleFilters )
         throws IOException
     {
@@ -78,17 +79,7 @@ public class MinijarFilter
         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
-            {
-                IOUtil.close( is );
-            }
+            addDependencyToClasspath( cp, dependency );
         }
 
         removable = cp.getClazzes();
@@ -100,14 +91,37 @@ public class MinijarFilter
             : simpleFilters );
     }
 
+    private ClazzpathUnit addDependencyToClasspath( Clazzpath cp, Artifact dependency ) throws IOException
+    {
+        InputStream is = null;
+        ClazzpathUnit clazzpathUnit = null;
+        try
+        {
+            is = new FileInputStream( dependency.getFile() );
+            clazzpathUnit = cp.addClazzpathUnit( is, dependency.toString() );
+        }
+        catch( ArrayIndexOutOfBoundsException e )
+        {
+            //trap ArrayIndexOutOfBoundsExceptions caused by malformed dependency classes (MSHADE-107)
+            log.warn( dependency.toString() + " could not be analyzed for minimization; dependency is probably malformed." );
+        }
+        finally
+        {
+            IOUtil.close( is );
+        }
+        
+        return clazzpathUnit;
+    }
+    
     private void removePackages( ClazzpathUnit artifactUnit )
     {
-        Set packageNames = new HashSet();
+        Set<String> packageNames = new HashSet<String>();
         removePackages( artifactUnit.getClazzes(), packageNames );
         removePackages( artifactUnit.getTransitiveDependencies(), packageNames );
     }
 
-    private void removePackages( Set clazzes, Set packageNames )
+    @SuppressWarnings( "rawtypes" )
+    private void removePackages( Set clazzes, Set<String> packageNames )
     {
         Iterator it = clazzes.iterator();
         while ( it.hasNext() )
@@ -125,6 +139,7 @@ public class MinijarFilter
         }
     }
 
+    @SuppressWarnings( "rawtypes" )
     private void removeSpecificallyIncludedClasses( MavenProject project, List<SimpleFilter> simpleFilters )
         throws IOException
     {
@@ -140,18 +155,7 @@ public class MinijarFilter
                 SimpleFilter simpleFilter = i.next();
                 if ( simpleFilter.canFilter( jar ) )
                 {
-                    InputStream is = null;
-                    ClazzpathUnit depClazzpathUnit = null;
-                    try
-                    {
-                        is = new FileInputStream( dependency.getFile() );
-                        depClazzpathUnit = checkCp.addClazzpathUnit( is, dependency.toString() );
-                    }
-                    finally
-                    {
-                        IOUtil.close( is );
-                    }
-
+                    ClazzpathUnit depClazzpathUnit = addDependencyToClasspath( checkCp, dependency );
                     if ( depClazzpathUnit != null )
                     {
                         Iterator<Clazz> j = removable.iterator();