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;