This is an automated email from the ASF dual-hosted git repository. cstamas pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git
The following commit(s) were added to refs/heads/master by this push: new fa5e40d [MSHADE-389] Get rid of old baggage fa5e40d is described below commit fa5e40dc59355163d89cd904fcf4c4724ba3d3d6 Author: Tamas Cservenak <ta...@cservenak.net> AuthorDate: Fri May 21 09:33:16 2021 +0200 [MSHADE-389] Get rid of old baggage https://issues.apache.org/jira/browse/MSHADE-389 Changes: * get rid of Plexus Container et al (container, annotations, AbstractLogEnabled, etc) * get rid of use of Guava (only Multimap was used from it, use commons-collections4 instead) * up to Maven 3.1.x * Note: UTs are still using PlexusTestCase as Maven 3.1.x has no SISU index --- pom.xml | 115 +++++++++--- .../apache/maven/plugins/shade/DefaultShader.java | 75 ++++---- .../org/apache/maven/plugins/shade/Shader.java | 2 - .../apache/maven/plugins/shade/mojo/ShadeMojo.java | 33 ++-- .../maven/plugins/shade/DefaultShaderTest.java | 193 +++++++++------------ .../org/apache/maven/plugins/shade/MockShader.java | 7 +- .../maven/plugins/shade/mojo/ShadeMojoTest.java | 13 +- 7 files changed, 241 insertions(+), 197 deletions(-) diff --git a/pom.xml b/pom.xml index 5e48386..ec4dba7 100644 --- a/pom.xml +++ b/pom.xml @@ -65,8 +65,9 @@ </distributionManagement> <properties> - <mavenVersion>3.0</mavenVersion> + <mavenVersion>3.1.1</mavenVersion> <javaVersion>7</javaVersion> + <sisu.version>0.3.4</sisu.version> <currentVersion>${project.version}</currentVersion> <asmVersion>9.1</asmVersion> <project.build.outputTimestamp>2020-05-23T15:29:40Z</project.build.outputTimestamp> @@ -90,27 +91,51 @@ </contributor> </contributors> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.eclipse.sisu</groupId> + <artifactId>org.eclipse.sisu.inject</artifactId> + <version>${sisu.version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.sisu</groupId> + <artifactId>org.eclipse.sisu.plexus</artifactId> + <version>${sisu.version}</version> + </dependency> + <dependency> + <groupId>org.sonatype.sisu</groupId> + <artifactId>sisu-guice</artifactId> + <version>3.2.6</version> + </dependency> + </dependencies> + </dependencyManagement> + <dependencies> <!-- Maven --> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>${mavenVersion}</version> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>${mavenVersion}</version> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> <version>${mavenVersion}</version> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <version>${mavenVersion}</version> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> @@ -125,13 +150,33 @@ <version>3.3.0</version> </dependency> + <!-- DI --> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-artifact-transfer</artifactId> <version>0.13.1</version> + <exclusions> + <exclusion> + <groupId>org.sonatype.sisu</groupId> + <artifactId>sisu-inject-plexus</artifactId> + </exclusion> + </exclusions> </dependency> + <!-- Others --> <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.7.30</version> + </dependency> + <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>${asmVersion}</version> @@ -163,37 +208,46 @@ <version>2.6.0</version> </dependency> <dependency> - <groupId>org.codehaus.plexus</groupId> - <artifactId>plexus-component-annotations</artifactId> - <scope>provided</scope> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.8.1</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-collections4</artifactId> + <version>4.2</version> </dependency> + <!-- Test --> + <!-- Used by: TransformerTesterRule only --> + <dependency> + <groupId>org.eclipse.sisu</groupId> + <artifactId>org.eclipse.sisu.plexus</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.sonatype.sisu</groupId> + <artifactId>sisu-guice</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> - + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-core</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> <dependency> <groupId>org.xmlunit</groupId> <artifactId>xmlunit-legacy</artifactId> <version>2.7.0</version> <scope>test</scope> </dependency> - - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - <version>30.0-android</version> - </dependency> - - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - <version>3.8.1</version> - </dependency> - <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> @@ -244,21 +298,26 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.eclipse.sisu</groupId> + <artifactId>sisu-maven-plugin</artifactId> + <version>${sisu.version}</version> + <executions> + <execution> + <goals> + <goal>main-index</goal> + <goal>test-index</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </pluginManagement> <plugins> <plugin> - <groupId>org.codehaus.plexus</groupId> - <artifactId>plexus-component-metadata</artifactId> - <executions> - <execution> - <goals> - <goal>generate-metadata</goal> - <goal>generate-test-metadata</goal> - </goals> - </execution> - </executions> + <groupId>org.eclipse.sisu</groupId> + <artifactId>sisu-maven-plugin</artifactId> </plugin> </plugins> </build> diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java index d5c19c3..9226e3b 100644 --- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java +++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java @@ -38,6 +38,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -48,6 +49,11 @@ import java.util.zip.CRC32; import java.util.zip.ZipEntry; import java.util.zip.ZipException; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.multimap.HashSetValuedHashMap; import org.apache.commons.lang3.StringUtils; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.shade.filter.Filter; @@ -55,28 +61,37 @@ import org.apache.maven.plugins.shade.relocation.Relocator; import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer; import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer; import org.apache.maven.plugins.shade.resource.ResourceTransformer; -import org.codehaus.plexus.component.annotations.Component; -import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.util.IOUtil; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.commons.ClassRemapper; import org.objectweb.asm.commons.Remapper; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Jason van Zyl */ -@Component( role = Shader.class, hint = "default" ) +@Singleton +@Named public class DefaultShader - extends AbstractLogEnabled implements Shader { private static final int BUFFER_SIZE = 32 * 1024; + private final Logger logger; + + public DefaultShader() + { + this( LoggerFactory.getLogger( DefaultShader.class ) ); + } + + public DefaultShader( final Logger logger ) + { + this.logger = Objects.requireNonNull( logger ); + } + public void shade( ShadeRequest shadeRequest ) throws IOException, MojoExecutionException { @@ -106,13 +121,13 @@ public class DefaultShader goThroughAllJarEntriesForManifestTransformer( shadeRequest, resources, manifestTransformer, out ); // CHECKSTYLE_OFF: MagicNumber - Multimap<String, File> duplicates = HashMultimap.create( 10000, 3 ); + MultiValuedMap<String, File> duplicates = new HashSetValuedHashMap<>( 10000, 3 ); // CHECKSTYLE_ON: MagicNumber shadeJars( shadeRequest, resources, transformers, remapper, out, duplicates ); // CHECKSTYLE_OFF: MagicNumber - Multimap<Collection<File>, String> overlapping = HashMultimap.create( 20, 15 ); + MultiValuedMap<Collection<File>, String> overlapping = new HashSetValuedHashMap<>( 20, 15 ); // CHECKSTYLE_ON: MagicNumber for ( String clazz : duplicates.keySet() ) @@ -207,13 +222,13 @@ public class DefaultShader } private void shadeJars( ShadeRequest shadeRequest, Set<String> resources, List<ResourceTransformer> transformers, - RelocatorRemapper remapper, JarOutputStream jos, Multimap<String, File> duplicates ) + RelocatorRemapper remapper, JarOutputStream jos, MultiValuedMap<String, File> duplicates ) throws IOException, MojoExecutionException { for ( File jar : shadeRequest.getJars() ) { - getLogger().debug( "Processing JAR " + jar ); + logger.debug( "Processing JAR " + jar ); List<Filter> jarFilters = getFilters( jar, shadeRequest.getFilters() ); @@ -242,7 +257,7 @@ public class DefaultShader if ( "module-info.class".equals( name ) ) { - getLogger().warn( "Discovered module-info.class. " + logger.warn( "Discovered module-info.class. " + "Shading will break its strong encapsulation." ); continue; } @@ -265,8 +280,8 @@ public class DefaultShader private void shadeSingleJar( ShadeRequest shadeRequest, Set<String> resources, List<ResourceTransformer> transformers, RelocatorRemapper remapper, - JarOutputStream jos, Multimap<String, File> duplicates, File jar, JarFile jarFile, - JarEntry entry, String name ) + JarOutputStream jos, MultiValuedMap<String, File> duplicates, File jar, + JarFile jarFile, JarEntry entry, String name ) throws IOException, MojoExecutionException { try ( InputStream in = jarFile.getInputStream( entry ) ) @@ -307,7 +322,7 @@ public class DefaultShader // Avoid duplicates that aren't accounted for by the resource transformers if ( resources.contains( mappedName ) ) { - getLogger().debug( "We have a duplicate " + name + " in " + jar ); + logger.debug( "We have a duplicate " + name + " in " + jar ); return; } @@ -315,7 +330,7 @@ public class DefaultShader } else { - duplicates.remove( name, jar ); + duplicates.removeMapping( name, jar ); } } } @@ -358,16 +373,16 @@ public class DefaultShader private void showOverlappingWarning() { - getLogger().warn( "maven-shade-plugin has detected that some class files are" ); - getLogger().warn( "present in two or more JARs. When this happens, only one" ); - getLogger().warn( "single version of the class is copied to the uber jar." ); - getLogger().warn( "Usually this is not harmful and you can skip these warnings," ); - getLogger().warn( "otherwise try to manually exclude artifacts based on" ); - getLogger().warn( "mvn dependency:tree -Ddetail=true and the above output." ); - getLogger().warn( "See http://maven.apache.org/plugins/maven-shade-plugin/" ); + logger.warn( "maven-shade-plugin has detected that some class files are" ); + logger.warn( "present in two or more JARs. When this happens, only one" ); + logger.warn( "single version of the class is copied to the uber jar." ); + logger.warn( "Usually this is not harmful and you can skip these warnings," ); + logger.warn( "otherwise try to manually exclude artifacts based on" ); + logger.warn( "mvn dependency:tree -Ddetail=true and the above output." ); + logger.warn( "See http://maven.apache.org/plugins/maven-shade-plugin/" ); } - private void logSummaryOfDuplicates( Multimap<Collection<File>, String> overlapping ) + private void logSummaryOfDuplicates( MultiValuedMap<Collection<File>, String> overlapping ) { for ( Collection<File> jarz : overlapping.keySet() ) { @@ -424,7 +439,7 @@ public class DefaultShader all.addAll( classes ); all.addAll( resources ); - getLogger().warn( + logger.warn( StringUtils.join( jarzS, ", " ) + " define " + all.size() + " overlapping " + StringUtils.join( overlaps, " and " ) + ": " ); //CHECKSTYLE_ON: LineLength @@ -435,12 +450,12 @@ public class DefaultShader for ( int i = 0; i < Math.min( max, all.size() ); i++ ) { - getLogger().warn( " - " + all.get( i ) ); + logger.warn( " - " + all.get( i ) ); } if ( all.size() > max ) { - getLogger().warn( " - " + ( all.size() - max ) + " more..." ); + logger.warn( " - " + ( all.size() - max ) + " more..." ); } } @@ -512,7 +527,7 @@ public class DefaultShader } catch ( ZipException e ) { - getLogger().debug( "We have a duplicate " + name + " in " + jar ); + logger.debug( "We have a duplicate " + name + " in " + jar ); } return; @@ -572,7 +587,7 @@ public class DefaultShader } catch ( ZipException e ) { - getLogger().debug( "We have a duplicate " + mappedName + " in " + jar ); + logger.debug( "We have a duplicate " + mappedName + " in " + jar ); } } @@ -599,7 +614,7 @@ public class DefaultShader { if ( transformer.canTransformResource( name ) ) { - getLogger().debug( "Transforming " + name + " using " + transformer.getClass().getName() ); + logger.debug( "Transforming " + name + " using " + transformer.getClass().getName() ); if ( transformer instanceof ReproducibleResourceTransformer ) { diff --git a/src/main/java/org/apache/maven/plugins/shade/Shader.java b/src/main/java/org/apache/maven/plugins/shade/Shader.java index 02e628c..b93a7a5 100644 --- a/src/main/java/org/apache/maven/plugins/shade/Shader.java +++ b/src/main/java/org/apache/maven/plugins/shade/Shader.java @@ -28,8 +28,6 @@ import org.apache.maven.plugin.MojoExecutionException; */ public interface Shader { - String ROLE = Shader.class.getName(); - /** * Perform a shading operation. * diff --git a/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java b/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java index 2f8f6c5..25b8330 100644 --- a/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java +++ b/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java @@ -55,12 +55,6 @@ import org.apache.maven.shared.dependency.graph.DependencyNode; import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; -import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; -import org.codehaus.plexus.context.Context; -import org.codehaus.plexus.context.ContextException; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.WriterFactory; @@ -81,6 +75,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.inject.Inject; + /** * Mojo that performs shading delegating to the Shader component. * @@ -94,7 +90,6 @@ import java.util.Set; // CHECKSTYLE_ON: LineLength public class ShadeMojo extends AbstractMojo - implements Contextualizable { /** * The current Maven session. @@ -375,15 +370,10 @@ public class ShadeMojo private boolean shadeTestJar; /** - * @since 1.6 + * All the present Shaders. */ - private PlexusContainer plexusContainer; - - public void contextualize( Context context ) - throws ContextException - { - plexusContainer = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); - } + @Inject + private Map<String, Shader> shaders; /** * @throws MojoExecutionException in case of an error. @@ -651,14 +641,13 @@ public class ShadeMojo { if ( shaderHint != null ) { - try - { - shader = (Shader) plexusContainer.lookup( Shader.ROLE, shaderHint ); - } - catch ( ComponentLookupException e ) + shader = shaders.get( shaderHint ); + + if ( shader == null ) { - throw new MojoExecutionException( "unable to lookup own Shader implementation with hint:'" + shaderHint - + "'", e ); + throw new MojoExecutionException( + "unable to lookup own Shader implementation with hint: '" + shaderHint + "'" + ); } } } diff --git a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java index 249258f..d48fd43 100644 --- a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java +++ b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java @@ -46,19 +46,26 @@ import org.apache.maven.plugins.shade.relocation.SimpleRelocator; import org.apache.maven.plugins.shade.resource.AppendingTransformer; import org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer; import org.apache.maven.plugins.shade.resource.ResourceTransformer; -import org.codehaus.plexus.logging.AbstractLogger; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.logging.console.ConsoleLogger; import org.codehaus.plexus.util.IOUtil; +import org.codehaus.plexus.util.Os; import org.junit.Assert; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.mockito.ArgumentCaptor; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Opcodes; +import org.slf4j.Logger; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * @author Jason van Zyl @@ -71,9 +78,7 @@ public class DefaultShaderTest @Test public void testOverlappingResourcesAreLogged() throws IOException, MojoExecutionException { - final DefaultShader shader = new DefaultShader(); - final MockLogger logs = new MockLogger(); - shader.enableLogging(logs); + final DefaultShader shader = newShader(); // we will shade two jars and expect to see META-INF/MANIFEST.MF overlaps, this will always be true // but this can lead to a broken deployment if intended for OSGi or so, so even this should be logged @@ -89,67 +94,70 @@ public class DefaultShaderTest shadeRequest.setUberJar( new File( "target/foo-custom_testOverlappingResourcesAreLogged.jar" ) ); shader.shade( shadeRequest ); - final String failureWarnMessage = logs.warnMessages.toString(); - assertTrue( failureWarnMessage, logs.warnMessages.contains( - "plexus-utils-1.4.1.jar, test-project-1.0-SNAPSHOT.jar define 1 overlapping resource:") ); - assertTrue( failureWarnMessage, logs.warnMessages.contains("- META-INF/MANIFEST.MF") ); - - final String failureDebugMessage = logs.debugMessages.toString(); - assertTrue( failureDebugMessage, logs.debugMessages.contains( - "We have a duplicate META-INF/MANIFEST.MF in src/test/jars/plexus-utils-1.4.1.jar" ) ); + assertThat(warnMessages.getAllValues(), + hasItem(containsString("plexus-utils-1.4.1.jar, test-project-1.0-SNAPSHOT.jar define 1 overlapping resource:"))); + assertThat(warnMessages.getAllValues(), + hasItem(containsString("- META-INF/MANIFEST.MF"))); + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + assertThat(debugMessages.getAllValues(), + hasItem(containsString("We have a duplicate META-INF/MANIFEST.MF in src\\test\\jars\\plexus-utils-1.4.1.jar"))); + } + else { + assertThat(debugMessages.getAllValues(), + hasItem(containsString("We have a duplicate META-INF/MANIFEST.MF in src/test/jars/plexus-utils-1.4.1.jar"))); + } } @Test public void testOverlappingResourcesAreLoggedExceptATransformerHandlesIt() throws Exception { TemporaryFolder temporaryFolder = new TemporaryFolder(); - Set<File> set = new LinkedHashSet<>(); - temporaryFolder.create(); - File j1 = temporaryFolder.newFile("j1.jar"); - try ( JarOutputStream jos = new JarOutputStream(new FileOutputStream( j1 ) ) ) - { - jos.putNextEntry(new JarEntry( "foo.txt" )); - jos.write("c1".getBytes(StandardCharsets.UTF_8)); - jos.closeEntry(); + try { + Set<File> set = new LinkedHashSet<>(); + temporaryFolder.create(); + File j1 = temporaryFolder.newFile("j1.jar"); + try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(j1))) { + jos.putNextEntry(new JarEntry("foo.txt")); + jos.write("c1".getBytes(StandardCharsets.UTF_8)); + jos.closeEntry(); + } + File j2 = temporaryFolder.newFile("j2.jar"); + try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(j2))) { + jos.putNextEntry(new JarEntry("foo.txt")); + jos.write("c2".getBytes(StandardCharsets.UTF_8)); + jos.closeEntry(); + } + set.add(j1); + set.add(j2); + + AppendingTransformer transformer = new AppendingTransformer(); + Field resource = AppendingTransformer.class.getDeclaredField("resource"); + resource.setAccessible(true); + resource.set(transformer, "foo.txt"); + + ShadeRequest shadeRequest = new ShadeRequest(); + shadeRequest.setJars(set); + shadeRequest.setRelocators(Collections.<Relocator>emptyList()); + shadeRequest.setResourceTransformers(Collections.<ResourceTransformer>singletonList(transformer)); + shadeRequest.setFilters(Collections.<Filter>emptyList()); + shadeRequest.setUberJar(new File("target/foo-custom_testOverlappingResourcesAreLogged.jar")); + + DefaultShader shaderWithTransformer = newShader(); + shaderWithTransformer.shade(shadeRequest); + + assertThat(warnMessages.getAllValues().size(), is(0) ); + + DefaultShader shaderWithoutTransformer = newShader(); + shadeRequest.setResourceTransformers(Collections.<ResourceTransformer>emptyList()); + shaderWithoutTransformer.shade(shadeRequest); + + assertThat(warnMessages.getAllValues(), + hasItems(containsString("j1.jar, j2.jar define 1 overlapping resource:"))); + assertThat(warnMessages.getAllValues(), + hasItems(containsString("- foo.txt"))); } - File j2 = temporaryFolder.newFile("j2.jar"); - try ( JarOutputStream jos = new JarOutputStream(new FileOutputStream( j2 ) ) ) - { - jos.putNextEntry(new JarEntry( "foo.txt" )); - jos.write("c2".getBytes(StandardCharsets.UTF_8)); - jos.closeEntry(); + finally { + temporaryFolder.delete(); } - set.add( j1 ); - set.add( j2 ); - - AppendingTransformer transformer = new AppendingTransformer(); - Field resource = AppendingTransformer.class.getDeclaredField( "resource" ); - resource.setAccessible( true ); - resource.set( transformer, "foo.txt" ); - - ShadeRequest shadeRequest = new ShadeRequest(); - shadeRequest.setJars( set ); - shadeRequest.setRelocators( Collections.<Relocator>emptyList() ); - shadeRequest.setResourceTransformers( Collections.<ResourceTransformer>singletonList( transformer) ); - shadeRequest.setFilters( Collections.<Filter>emptyList() ); - shadeRequest.setUberJar( new File( "target/foo-custom_testOverlappingResourcesAreLogged.jar" ) ); - - DefaultShader shaderWithTransformer = new DefaultShader(); - final MockLogger logWithTransformer = new MockLogger(); - shaderWithTransformer.enableLogging( logWithTransformer ); - shaderWithTransformer.shade( shadeRequest ); - - DefaultShader shaderWithoutTransformer = new DefaultShader(); - MockLogger logWithoutTransformer = new MockLogger(); - shaderWithoutTransformer.enableLogging( logWithoutTransformer ); - shadeRequest.setResourceTransformers( Collections.<ResourceTransformer>emptyList() ); - shaderWithoutTransformer.shade( shadeRequest ); - - temporaryFolder.delete(); - - assertTrue( logWithTransformer.warnMessages.toString(), logWithTransformer.warnMessages.isEmpty() ); - assertTrue( logWithoutTransformer.warnMessages.toString(), - logWithoutTransformer.warnMessages.containsAll( - Arrays.asList( "j1.jar, j2.jar define 1 overlapping resource:", "- foo.txt" ) ) ); } @Test @@ -360,59 +368,24 @@ public class DefaultShaderTest s.shade( shadeRequest ); } - private static DefaultShader newShader() + private DefaultShader newShader() { - DefaultShader s = new DefaultShader(); - - s.enableLogging( new ConsoleLogger( Logger.LEVEL_INFO, "TEST" ) ); - - return s; + return new DefaultShader(mockLogger()); } - private static class MockLogger extends AbstractLogger - { - private final List<String> debugMessages = new ArrayList<>(); - private final List<String> warnMessages = new ArrayList<>(); - - private MockLogger() - { - super( Logger.LEVEL_INFO, "test" ); - } - - @Override - public void debug( String s, Throwable throwable ) - { - debugMessages.add( s.replace( '\\', '/' ).trim() ); - } + private ArgumentCaptor<String> debugMessages; - @Override - public void info( String s, Throwable throwable ) - { - // no-op - } + private ArgumentCaptor<String> warnMessages; - @Override - public void warn( String s, Throwable throwable ) - { - warnMessages.add( s.replace( '\\', '/' ).trim() ); - } - - @Override - public void error( String s, Throwable throwable ) - { - // no-op - } - - @Override - public void fatalError( String s, Throwable throwable ) - { - // no-op - } - - @Override - public Logger getChildLogger( String s ) - { - return this; - } + private Logger mockLogger() + { + debugMessages = ArgumentCaptor.forClass(String.class); + warnMessages = ArgumentCaptor.forClass(String.class); + Logger logger = mock(Logger.class); + when(logger.isDebugEnabled()).thenReturn(true); + when(logger.isWarnEnabled()).thenReturn(true); + doNothing().when(logger).debug(debugMessages.capture()); + doNothing().when(logger).warn(warnMessages.capture()); + return logger; } } diff --git a/src/test/java/org/apache/maven/plugins/shade/MockShader.java b/src/test/java/org/apache/maven/plugins/shade/MockShader.java index a1b65d5..436edc3 100644 --- a/src/test/java/org/apache/maven/plugins/shade/MockShader.java +++ b/src/test/java/org/apache/maven/plugins/shade/MockShader.java @@ -19,14 +19,17 @@ package org.apache.maven.plugins.shade; */ import org.apache.maven.plugin.MojoExecutionException; -import org.codehaus.plexus.component.annotations.Component; import java.io.IOException; +import javax.inject.Named; +import javax.inject.Singleton; + /** * @author Olivier Lamy */ -@Component( role = Shader.class, hint = "mock" ) +@Singleton +@Named( "mock" ) public class MockShader implements Shader { diff --git a/src/test/java/org/apache/maven/plugins/shade/mojo/ShadeMojoTest.java b/src/test/java/org/apache/maven/plugins/shade/mojo/ShadeMojoTest.java index 181287c..0799f3c 100644 --- a/src/test/java/org/apache/maven/plugins/shade/mojo/ShadeMojoTest.java +++ b/src/test/java/org/apache/maven/plugins/shade/mojo/ShadeMojoTest.java @@ -53,6 +53,8 @@ import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; +import org.codehaus.plexus.ContainerConfiguration; +import org.codehaus.plexus.PlexusConstants; import org.codehaus.plexus.PlexusTestCase; /** @@ -62,6 +64,11 @@ import org.codehaus.plexus.PlexusTestCase; public class ShadeMojoTest extends PlexusTestCase { + @Override + protected void customizeContainerConfiguration(final ContainerConfiguration configuration) { + configuration.setClassPathScanning(PlexusConstants.SCANNING_INDEX); + } + public void testManifestTransformerSelection() throws Exception { final ShadeMojo mojo = new ShadeMojo(); @@ -126,7 +133,7 @@ public class ShadeMojoTest { File jarFile = new File( getBasedir(), "target/unit/foo-bar.jar" ); - Shader s = (Shader) lookup( Shader.ROLE, "default" ); + Shader s = lookup( Shader.class ); Set<File> set = new LinkedHashSet<>(); set.add( new File( getBasedir(), "src/test/jars/test-artifact-1.0-SNAPSHOT.jar" ) ); @@ -224,7 +231,7 @@ public class ShadeMojoTest // create and configure MavenProject MavenProject project = new MavenProject(); - ArtifactHandler artifactHandler = (ArtifactHandler) lookup( ArtifactHandler.ROLE ); + ArtifactHandler artifactHandler = lookup( ArtifactHandler.class ); Artifact artifact = new DefaultArtifact( "org.apache.myfaces.core", "myfaces-impl", VersionRange.createFromVersion( "2.0.1-SNAPSHOT" ), "compile", "jar", null, artifactHandler ); @@ -266,7 +273,7 @@ public class ShadeMojoTest public void shaderWithPattern( String shadedPattern, File jar ) throws Exception { - Shader s = (Shader) lookup( Shader.ROLE ); + Shader s = lookup( Shader.class ); Set<File> set = new LinkedHashSet<>();