This is an automated email from the ASF dual-hosted git repository. gboue pushed a commit to branch MASSEMBLY-675 in repository https://gitbox.apache.org/repos/asf/maven-assembly-plugin.git
commit 78faddf88b1537bc5c61ba74cdb2b227416152b6 Author: Guillaume Boué <gb...@apache.org> AuthorDate: Tue Feb 20 00:24:48 2018 +0100 [MASSEMBLY-675] Maven Assembly packaging wildcard-excluded dependencies Since Maven 3 requirement, there is no need to resolve any dependencies manually, and we can rely on requiresDependencyResolution. Initial patch failed when module sets were involved: instead of getting the list of transitive/direct dependencies on the current project, they need to be fetched for each project so that it encompasses the possible modules in module sets. All the dead code as a result of this change is removed. This closes #2. --- .../projects/dependency-sets/massembly-675/pom.xml | 69 +++ .../massembly-675/src/main/assembly/bin.xml | 28 + .../dependency-sets/massembly-675/verify.bsh | 35 ++ .../artifact/DefaultDependencyResolver.java | 172 +----- .../artifact/ResolutionManagementInfo.java | 60 --- .../artifact/DefaultDependencyResolverTest.java | 584 +++------------------ .../artifact/ResolutionManagementInfoTest.java | 5 +- 7 files changed, 240 insertions(+), 713 deletions(-) diff --git a/src/it/projects/dependency-sets/massembly-675/pom.xml b/src/it/projects/dependency-sets/massembly-675/pom.xml new file mode 100644 index 0000000..369030c --- /dev/null +++ b/src/it/projects/dependency-sets/massembly-675/pom.xml @@ -0,0 +1,69 @@ +<?xml version="1.0"?> +<!-- +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. +--> +<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> + <parent> + <groupId>org.apache.maven.plugin.assembly.test</groupId> + <artifactId>it-project-parent</artifactId> + <version>1</version> + </parent> + + <groupId>test</groupId> + <artifactId>massembly-675</artifactId> + <version>1</version> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + <dependencies> + <dependency> + <groupId>com.google.javascript</groupId> + <artifactId>closure-compiler</artifactId> + <version>v20131014</version> + <exclusions> + <exclusion> + <artifactId>*</artifactId> + <groupId>*</groupId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <version>${testVersion}</version> + <executions> + <execution> + <id>assembly</id> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + <configuration> + <descriptors> + <descriptor>src/main/assembly/bin.xml</descriptor> + </descriptors> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/src/it/projects/dependency-sets/massembly-675/src/main/assembly/bin.xml b/src/it/projects/dependency-sets/massembly-675/src/main/assembly/bin.xml new file mode 100644 index 0000000..6cf159c --- /dev/null +++ b/src/it/projects/dependency-sets/massembly-675/src/main/assembly/bin.xml @@ -0,0 +1,28 @@ +<!-- +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. +--> +<assembly> + <id>bin</id> + <formats> + <format>dir</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + <dependencySets> + <dependencySet/> + </dependencySets> +</assembly> \ No newline at end of file diff --git a/src/it/projects/dependency-sets/massembly-675/verify.bsh b/src/it/projects/dependency-sets/massembly-675/verify.bsh new file mode 100644 index 0000000..f8a95ab --- /dev/null +++ b/src/it/projects/dependency-sets/massembly-675/verify.bsh @@ -0,0 +1,35 @@ +/* + * 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.*; + +boolean result = true; + +result = result && new File( basedir, "target/massembly-675-1-bin/massembly-675-1.jar" ).exists(); +result = result && new File( basedir, "target/massembly-675-1-bin/closure-compiler-v20131014.jar" ).exists(); + +// assert that all the transitive dependencies of closure-compiler were excluded +result = result && !new File( basedir, "target/massembly-675-1-bin/args4j-2.0.16.jar" ).exists(); +result = result && !new File( basedir, "target/massembly-675-1-bin/json-20090211.jar" ).exists(); +result = result && !new File( basedir, "target/massembly-675-1-bin/protobuf-java-2.4.1.jar" ).exists(); +result = result && !new File( basedir, "target/massembly-675-1-bin/jsr305-1.3.9.jar" ).exists(); +result = result && !new File( basedir, "target/massembly-675-1-bin/guava-15.0.jar" ).exists(); + + +return result; diff --git a/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java b/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java index 936e250..81a98cb 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java +++ b/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java @@ -19,15 +19,12 @@ package org.apache.maven.plugins.assembly.artifact; * under the License. */ -import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.plugins.assembly.AssemblerConfigurationSource; import org.apache.maven.plugins.assembly.archive.ArchiveCreationException; import org.apache.maven.plugins.assembly.archive.phase.ModuleSetAssemblyPhase; @@ -35,16 +32,8 @@ import org.apache.maven.plugins.assembly.model.Assembly; import org.apache.maven.plugins.assembly.model.DependencySet; import org.apache.maven.plugins.assembly.model.ModuleBinaries; import org.apache.maven.plugins.assembly.model.ModuleSet; -import org.apache.maven.plugins.assembly.model.Repository; -import org.apache.maven.plugins.assembly.resolved.AssemblyId; -import org.apache.maven.plugins.assembly.utils.FilterUtils; -import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.repository.RepositorySystem; -import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter; -import org.apache.maven.shared.artifact.resolve.ArtifactResult; -import org.apache.maven.shared.dependencies.resolve.DependencyResolverException; import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.AbstractLogEnabled; @@ -62,9 +51,6 @@ public class DefaultDependencyResolver @Requirement private RepositorySystem resolver; - @Requirement - private org.apache.maven.shared.dependencies.resolve.DependencyResolver dependencyResolver; - @Override public Map<DependencySet, Set<Artifact>> resolveDependencySets( final Assembly assembly, ModuleSet moduleSet, final AssemblerConfigurationSource configSource, @@ -78,38 +64,16 @@ public class DefaultDependencyResolver final MavenProject currentProject = configSource.getProject(); - final ResolutionManagementInfo info = new ResolutionManagementInfo( currentProject ); - updateRepositoryResolutionRequirements( assembly, info ); - final AssemblyId assemblyId = AssemblyId.createAssemblyId( assembly ); - updateDependencySetResolutionRequirements( dependencySet, info, assemblyId, - configSource.getMavenSession().getProjectBuildingRequest(), - currentProject ); - updateModuleSetResolutionRequirements( assemblyId, moduleSet, dependencySet, info, configSource ); + final ResolutionManagementInfo info = new ResolutionManagementInfo(); + updateDependencySetResolutionRequirements( dependencySet, info, currentProject ); + updateModuleSetResolutionRequirements( moduleSet, dependencySet, info, configSource ); - result.put( dependencySet, resolve( info, currentProject ) ); + result.put( dependencySet, info.getArtifacts() ); } return result; } - private Set<Artifact> resolve( ResolutionManagementInfo info, MavenProject project ) - { - Set<Artifact> artifacts = new HashSet<>(); - if ( info.isResolvedTransitively() ) - { - getLogger().debug( "Resolving project dependencies transitively." ); - artifacts = project.getArtifacts(); - } - else - { - getLogger().debug( "Resolving project dependencies ONLY. " - + "Transitive dependencies WILL NOT be included in the results." ); - artifacts = project.getDependencyArtifacts(); - } - - return artifacts; - } - @Override public Map<DependencySet, Set<Artifact>> resolveDependencySets( final Assembly assembly, final AssemblerConfigurationSource configSource, @@ -123,41 +87,16 @@ public class DefaultDependencyResolver final MavenProject currentProject = configSource.getProject(); - final ResolutionManagementInfo info = new ResolutionManagementInfo( currentProject ); - updateRepositoryResolutionRequirements( assembly, info ); - final AssemblyId assemblyId = AssemblyId.createAssemblyId( assembly ); - updateDependencySetResolutionRequirements( dependencySet, info, assemblyId, - configSource.getMavenSession().getProjectBuildingRequest(), - currentProject ); + final ResolutionManagementInfo info = new ResolutionManagementInfo(); + updateDependencySetResolutionRequirements( dependencySet, info, currentProject ); - result.put( dependencySet, resolve( info, currentProject ) ); + result.put( dependencySet, info.getArtifacts() ); } return result; } - - void updateRepositoryResolutionRequirements( final Assembly assembly, final ResolutionManagementInfo requirements ) - { - final List<Repository> repositories = assembly.getRepositories(); - - Set<String> rootScopes = new HashSet<String>(); - - if ( repositories != null && !repositories.isEmpty() ) - { - - requirements.setResolutionRequired( true ); - for ( final Repository repo : repositories ) - { - rootScopes.add( repo.getScope() ); - } - } - - requirements.setScopeFilter( FilterUtils.newScopeFilter( rootScopes ) ); - } - - - void updateModuleSetResolutionRequirements( AssemblyId assemblyId, ModuleSet set, DependencySet dependencySet, + void updateModuleSetResolutionRequirements( ModuleSet set, DependencySet dependencySet, final ResolutionManagementInfo requirements, final AssemblerConfigurationSource configSource ) throws DependencyResolutionException @@ -176,47 +115,30 @@ public class DefaultDependencyResolver e ); } - if ( !projects.isEmpty() ) + for ( final MavenProject p : projects ) { - for ( final MavenProject p : projects ) + if ( p.getArtifact() == null ) { - requirements.enableProjectResolution( p ); - - if ( p.getArtifact() == null ) - { - // TODO: such a call in MavenMetadataSource too - packaging not really the intention of - // type - final Artifact artifact = - resolver.createArtifact( p.getGroupId(), p.getArtifactId(), p.getVersion(), - p.getPackaging() ); - p.setArtifact( artifact ); - } + // TODO: such a call in MavenMetadataSource too - packaging not really the intention of type + final Artifact artifact = + resolver.createArtifact( p.getGroupId(), p.getArtifactId(), p.getVersion(), p.getPackaging() ); + p.setArtifact( artifact ); } } if ( binaries.isIncludeDependencies() ) { - updateDependencySetResolutionRequirements( dependencySet, requirements, assemblyId, - configSource.getMavenSession().getProjectBuildingRequest(), + updateDependencySetResolutionRequirements( dependencySet, requirements, projects.toArray( new MavenProject[projects.size()] ) ); } } } void updateDependencySetResolutionRequirements( final DependencySet set, - final ResolutionManagementInfo requirements, AssemblyId assemblyId, - ProjectBuildingRequest buildingRequest, + final ResolutionManagementInfo requirements, final MavenProject... projects ) throws DependencyResolutionException { - requirements.setResolutionRequired( true ); - - requirements.setResolvedTransitively( set.isUseTransitiveDependencies() ); - - ScopeFilter scopeFilter = FilterUtils.newScopeFilter( set.getScope() ); - - requirements.setScopeFilter( scopeFilter ); - for ( final MavenProject project : projects ) { if ( project == null ) @@ -224,30 +146,14 @@ public class DefaultDependencyResolver continue; } - Set<Artifact> dependencyArtifacts = project.getDependencyArtifacts(); - if ( dependencyArtifacts == null ) + Set<Artifact> dependencyArtifacts = null; + if ( set.isUseTransitiveDependencies() ) { - try - { - ProjectBuildingRequest pbr = new DefaultProjectBuildingRequest( buildingRequest ); - pbr.setRemoteRepositories( project.getRemoteArtifactRepositories() ); - Iterable<ArtifactResult> artifactResults = - dependencyResolver.resolveDependencies( pbr, project.getModel(), scopeFilter ); - - dependencyArtifacts = new HashSet<Artifact>(); - - for ( ArtifactResult artifactResult : artifactResults ) - { - dependencyArtifacts.add( artifactResult.getArtifact() ); - } - - project.setDependencyArtifacts( dependencyArtifacts ); - } - catch ( final DependencyResolverException e ) - { - throw new DependencyResolutionException( - "Failed to create dependency artifacts for resolution. Assembly: " + assemblyId, e ); - } + dependencyArtifacts = project.getArtifacts(); + } + else + { + dependencyArtifacts = project.getDependencyArtifacts(); } requirements.addArtifacts( dependencyArtifacts ); @@ -256,36 +162,4 @@ public class DefaultDependencyResolver } } - List<ArtifactRepository> aggregateRemoteArtifactRepositories( final List<ArtifactRepository> remoteRepositories, - final Set<MavenProject> projects ) - { - final List<List<ArtifactRepository>> repoLists = new ArrayList<List<ArtifactRepository>>(); - - repoLists.add( remoteRepositories ); - for ( final MavenProject project : projects ) - { - repoLists.add( project.getRemoteArtifactRepositories() ); - } - - final List<ArtifactRepository> remoteRepos = new ArrayList<ArtifactRepository>(); - final Set<String> encounteredUrls = new HashSet<String>(); - - for ( final List<ArtifactRepository> repositoryList : repoLists ) - { - if ( ( repositoryList != null ) && !repositoryList.isEmpty() ) - { - for ( final ArtifactRepository repo : repositoryList ) - { - if ( !encounteredUrls.contains( repo.getUrl() ) ) - { - remoteRepos.add( repo ); - encounteredUrls.add( repo.getUrl() ); - } - } - } - } - - return remoteRepos; - } - } diff --git a/src/main/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfo.java b/src/main/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfo.java index 87d1e3d..59904a4 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfo.java +++ b/src/main/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfo.java @@ -20,8 +20,6 @@ package org.apache.maven.plugins.assembly.artifact; */ import org.apache.maven.artifact.Artifact; -import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter; import java.util.LinkedHashSet; import java.util.Set; @@ -34,66 +32,8 @@ import java.util.Set; */ class ResolutionManagementInfo { - private ScopeFilter scopeFilter; - - private final Set<MavenProject> enabledProjects = new LinkedHashSet<MavenProject>(); - private final LinkedHashSet<Artifact> artifacts = new LinkedHashSet<Artifact>(); - private boolean resolutionRequired; - - private boolean resolvedTransitively; - - ResolutionManagementInfo( final MavenProject currentProject ) - { - enabledProjects.add( currentProject ); - } - - boolean isResolutionRequired() - { - return resolutionRequired; - } - - void setResolutionRequired( final boolean resolutionRequired ) - { - this.resolutionRequired = resolutionRequired; - } - - boolean isResolvedTransitively() - { - return resolvedTransitively; - } - - void setResolvedTransitively( final boolean resolvedTransitively ) - { - this.resolvedTransitively = this.resolvedTransitively || resolvedTransitively; - } - - ScopeFilter getScopeFilter() - { - return scopeFilter; - } - - void setScopeFilter( ScopeFilter scopeFilter ) - { - this.scopeFilter = scopeFilter; - } - - - - void enableProjectResolution( final MavenProject project ) - { - if ( !enabledProjects.contains( project ) ) - { - enabledProjects.add( project ); - } - } - - Set<MavenProject> getEnabledProjects() - { - return enabledProjects; - } - Set<Artifact> getArtifacts() { return artifacts; diff --git a/src/test/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolverTest.java b/src/test/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolverTest.java index 4d418b4..7b238c2 100644 --- a/src/test/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolverTest.java +++ b/src/test/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolverTest.java @@ -22,18 +22,16 @@ package org.apache.maven.plugins.assembly.artifact; import static org.easymock.EasyMock.expect; import java.io.File; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.List; +import java.util.HashSet; import java.util.Set; import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; +import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenExecutionRequest; @@ -42,33 +40,18 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Model; import org.apache.maven.plugin.testing.stubs.StubArtifactRepository; import org.apache.maven.plugins.assembly.AssemblerConfigurationSource; -import org.apache.maven.plugins.assembly.model.Assembly; import org.apache.maven.plugins.assembly.model.DependencySet; import org.apache.maven.plugins.assembly.model.ModuleBinaries; import org.apache.maven.plugins.assembly.model.ModuleSet; -import org.apache.maven.plugins.assembly.model.Repository; -import org.apache.maven.plugins.assembly.resolved.AssemblyId; -import org.apache.maven.project.DefaultProjectBuildingRequest; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.repository.internal.MavenRepositorySystemSession; import org.codehaus.plexus.PlexusTestCase; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.logging.console.ConsoleLogger; import org.easymock.classextension.EasyMockSupport; -import org.sonatype.aether.RepositorySystemSession; -import org.sonatype.aether.repository.LocalRepositoryManager; public class DefaultDependencyResolverTest extends PlexusTestCase { - private ArtifactFactory factory; - - private ArtifactRepositoryFactory repoFactory; - - private ArtifactRepositoryLayout layout; - private DefaultDependencyResolver resolver; @Override @@ -78,10 +61,6 @@ public class DefaultDependencyResolverTest super.setUp(); resolver = (DefaultDependencyResolver) lookup( DependencyResolver.class ); - - factory = lookup( ArtifactFactory.class ); - repoFactory = lookup( ArtifactRepositoryFactory.class ); - layout = lookup( ArtifactRepositoryLayout.class, "default" ); } protected MavenSession newMavenSession( MavenProject project ) @@ -100,41 +79,49 @@ public class DefaultDependencyResolverTest } - public void test_getDependencySetResolutionRequirements() + public void test_getDependencySetResolutionRequirements_transitive() throws DependencyResolutionException { - final DependencySet ds1 = new DependencySet(); - ds1.setScope( Artifact.SCOPE_COMPILE ); - ds1.setUseTransitiveDependencies( false ); - - final DependencySet ds2 = new DependencySet(); - ds2.setScope( Artifact.SCOPE_SYSTEM ); - ds2.setUseTransitiveDependencies( false ); + final DependencySet ds = new DependencySet(); + ds.setScope( Artifact.SCOPE_SYSTEM ); + ds.setUseTransitiveDependencies( true ); final MavenProject project = createMavenProject( "main-group", "main-artifact", "1", null ); - final ResolutionManagementInfo info = new ResolutionManagementInfo( project ); + Set<Artifact> dependencyArtifacts = new HashSet<>(); + dependencyArtifacts.add( newArtifact( "g.id", "a-id", "1" ) ); + Set<Artifact> artifacts = new HashSet<>( dependencyArtifacts ); + artifacts.add( newArtifact( "g.id", "a-id-2", "2" ) ); + project.setArtifacts( artifacts ); + project.setDependencyArtifacts( dependencyArtifacts ); - final Assembly assembly = new Assembly(); - - ProjectBuildingRequest buildingRequest = newMavenSession( project ).getProjectBuildingRequest(); - - resolver.updateDependencySetResolutionRequirements( ds1, info, AssemblyId.createAssemblyId( assembly ), - buildingRequest, project ); + final ResolutionManagementInfo info = new ResolutionManagementInfo(); + resolver.updateDependencySetResolutionRequirements( ds, info, project ); + assertEquals( artifacts, info.getArtifacts() ); + } - assertTrue( info.isResolutionRequired() ); - assertFalse( info.isResolvedTransitively() ); + public void test_getDependencySetResolutionRequirements_nonTransitive() + throws DependencyResolutionException + { + final DependencySet ds = new DependencySet(); + ds.setScope( Artifact.SCOPE_SYSTEM ); + ds.setUseTransitiveDependencies( false ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_COMPILE ) ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_SYSTEM ) ); + final MavenProject project = createMavenProject( "main-group", "main-artifact", "1", null ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_PROVIDED ) ); + Set<Artifact> dependencyArtifacts = new HashSet<>(); + dependencyArtifacts.add( newArtifact( "g.id", "a-id", "1" ) ); + Set<Artifact> artifacts = new HashSet<>( dependencyArtifacts ); + artifacts.add( newArtifact( "g.id", "a-id-2", "2" ) ); + project.setArtifacts( artifacts ); + project.setDependencyArtifacts( dependencyArtifacts ); - assertFalse( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_RUNTIME ) ); - assertFalse( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_TEST ) ); + final ResolutionManagementInfo info = new ResolutionManagementInfo(); + resolver.updateDependencySetResolutionRequirements( ds, info, project ); + assertEquals( dependencyArtifacts, info.getArtifacts() ); } - public void test_getModuleSetResolutionRequirements() + public void test_getModuleSetResolutionRequirements_withoutBinaries() throws DependencyResolutionException { final EasyMockSupport mm = new EasyMockSupport(); @@ -143,484 +130,71 @@ public class DefaultDependencyResolverTest final File rootDir = new File( "root" ); final MavenProject project = createMavenProject( "main-group", "main-artifact", "1", rootDir ); - - final File module1Dir = new File( rootDir, "module-1" ); - final MavenProject module1 = createMavenProject( "main-group", "module-1", "1", module1Dir ); - final MavenProject module1a = - createMavenProject( "group1", "module-1a", "1", new File( module1Dir, "module-1a" ) ); - final MavenProject module1b = - createMavenProject( "group1.b", "module-1b", "1", new File( module1Dir, "module-1b" ) ); - - module1.getModel().addModule( module1a.getArtifactId() ); - module1.getModel().addModule( module1b.getArtifactId() ); - - final File module2Dir = new File( rootDir, "module-2" ); - final MavenProject module2 = createMavenProject( "main-group", "module-2", "1", module2Dir ); - final MavenProject module2a = - createMavenProject( "main-group", "module-2a", "1", new File( module2Dir, "module-2a" ) ); - - module2.getModel().addModule( module2a.getArtifactId() ); + final MavenProject module1 = + createMavenProject( "main-group", "module-1", "1", new File( rootDir, "module-1" ) ); + final MavenProject module2 = + createMavenProject( "main-group", "module-2", "1", new File( rootDir, "module-2" ) ); project.getModel().addModule( module1.getArtifactId() ); project.getModel().addModule( module2.getArtifactId() ); - final List<MavenProject> allProjects = new ArrayList<MavenProject>(); - allProjects.add( project ); - allProjects.add( module1 ); - allProjects.add( module1a ); - allProjects.add( module1b ); - allProjects.add( module2 ); - allProjects.add( module2a ); - - expect( cs.getReactorProjects() ).andReturn( allProjects ).anyTimes(); - + expect( cs.getReactorProjects() ).andReturn( Arrays.asList( project, module1, module2 ) ).anyTimes(); expect( cs.getProject() ).andReturn( project ).anyTimes(); - expect( cs.getMavenSession() ).andReturn( newMavenSession( project ) ).anyTimes(); - final ResolutionManagementInfo info = new ResolutionManagementInfo( project ); - - final List<ModuleSet> moduleSets = new ArrayList<ModuleSet>(); - - final ModuleSet ms1 = new ModuleSet(); - final DependencySet ds1 = new DependencySet(); - { - ms1.addInclude( "*module1*" ); - ms1.setIncludeSubModules( false ); - - final ModuleBinaries mb = new ModuleBinaries(); - - ds1.setScope( Artifact.SCOPE_COMPILE ); - - mb.addDependencySet( ds1 ); - ms1.setBinaries( mb ); - moduleSets.add( ms1 ); - } - - final ModuleSet ms2 = new ModuleSet(); - final DependencySet ds2 = new DependencySet(); - { - ms2.addInclude( "main-group:*" ); - ms2.setIncludeSubModules( true ); + final ResolutionManagementInfo info = new ResolutionManagementInfo(); - final ModuleBinaries mb = new ModuleBinaries(); - - ds2.setScope( Artifact.SCOPE_TEST ); - - mb.addDependencySet( ds2 ); - ms2.setBinaries( mb ); - moduleSets.add( ms2 ); - } + final ModuleSet ms = new ModuleSet(); + ms.setBinaries( null ); mm.replayAll(); - resolver.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ); - - final Assembly assembly = new Assembly(); - assembly.setModuleSets( moduleSets ); - - resolver.updateModuleSetResolutionRequirements( AssemblyId.createAssemblyId( assembly ), ms1, ds1, info, cs ); - resolver.updateModuleSetResolutionRequirements( AssemblyId.createAssemblyId( assembly ), ms2, ds2, info, cs ); - - assertTrue( info.isResolutionRequired() ); - - final Set<MavenProject> enabledProjects = info.getEnabledProjects(); - assertTrue( enabledProjects.contains( project ) ); - - assertTrue( enabledProjects.contains( module1 ) ); - - // these should be excluded since sub-modules are not traversable - assertFalse( enabledProjects.contains( module1a ) ); - assertFalse( enabledProjects.contains( module1b ) ); - - assertTrue( enabledProjects.contains( module2 ) ); - assertTrue( enabledProjects.contains( module2a ) ); - - // these are the two we directly set above. - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_TEST ) ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_COMPILE ) ); - - // this combination should be implied by the two direct scopes set above. - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_RUNTIME ) ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_PROVIDED ) ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_SYSTEM ) ); + resolver.updateModuleSetResolutionRequirements( ms, new DependencySet(), info, cs ); + assertTrue( info.getArtifacts().isEmpty() ); mm.verifyAll(); } - public void test_getRepositoryResolutionRequirements() + public void test_getModuleSetResolutionRequirements_includeDeps() + throws DependencyResolutionException { - final List<Repository> repositories = new ArrayList<Repository>(); - - { - final Repository r = new Repository(); - r.setScope( Artifact.SCOPE_COMPILE ); - repositories.add( r ); - } - - { - final Repository r = new Repository(); - r.setScope( Artifact.SCOPE_SYSTEM ); - repositories.add( r ); - } - - final MavenProject project = createMavenProject( "group", "artifact", "1.0", null ); - final Assembly assembly = new Assembly(); - assembly.setRepositories( repositories ); - - final ResolutionManagementInfo info = new ResolutionManagementInfo( project ); - resolver.updateRepositoryResolutionRequirements( assembly, - info ); - - assertTrue( info.isResolutionRequired() ); - - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_COMPILE ) ); - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_SYSTEM ) ); - - assertTrue( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_PROVIDED ) ); - - assertFalse( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_RUNTIME ) ); - assertFalse( info.getScopeFilter().getIncluded().contains( Artifact.SCOPE_TEST ) ); - } + final EasyMockSupport mm = new EasyMockSupport(); - public void test_aggregateRemoteArtifactRepositories() - { - final List<ArtifactRepository> externalRepos = new ArrayList<ArtifactRepository>(); + final AssemblerConfigurationSource cs = mm.createMock( AssemblerConfigurationSource.class ); - final ArtifactRepository er1 = - repoFactory.createArtifactRepository( "test.1", "http://test.com/path", layout, null, null ); - externalRepos.add( er1 ); + final File rootDir = new File( "root" ); + final MavenProject project = createMavenProject( "main-group", "main-artifact", "1", rootDir ); + final MavenProject module1 = + createMavenProject( "main-group", "module-1", "1", new File( rootDir, "module-1" ) ); + final MavenProject module2 = + createMavenProject( "main-group", "module-2", "1", new File( rootDir, "module-2" ) ); - final ArtifactRepository er2 = - repoFactory.createArtifactRepository( "test.2", "http://test2.com/path", layout, null, null ); - externalRepos.add( er2 ); + Set<Artifact> module1Artifacts = Collections.singleton( newArtifact( "group.id", "module-1-dep", "1" ) ); + Set<Artifact> module2Artifacts = Collections.singleton( newArtifact( "group.id", "module-2-dep", "1" ) ); + module1.setArtifacts( module1Artifacts ); + module2.setArtifacts( module2Artifacts ); - final List<ArtifactRepository> projectRepos = new ArrayList<ArtifactRepository>(); + project.getModel().addModule( module1.getArtifactId() ); + project.getModel().addModule( module2.getArtifactId() ); - final ArtifactRepository pr1 = - repoFactory.createArtifactRepository( "project.1", "http://test.com/project", layout, null, null ); - projectRepos.add( pr1 ); + expect( cs.getReactorProjects() ).andReturn( Arrays.asList( project, module1, module2 ) ).anyTimes(); + expect( cs.getProject() ).andReturn( project ).anyTimes(); + expect( cs.getMavenSession() ).andReturn( newMavenSession( project ) ).anyTimes(); - final ArtifactRepository pr2 = - repoFactory.createArtifactRepository( "project.2", "http://test2.com/path", layout, null, null ); - projectRepos.add( pr2 ); + final ResolutionManagementInfo info = new ResolutionManagementInfo(); - final MavenProject project = createMavenProject( "group", "artifact", "1", new File( "base" ) ); - project.setRemoteArtifactRepositories( projectRepos ); + final ModuleSet ms = new ModuleSet(); + final ModuleBinaries mb = new ModuleBinaries(); + mb.setIncludeDependencies( true ); + ms.setBinaries( mb ); + ms.addInclude( "*:module-1" ); - final List<ArtifactRepository> aggregated = - resolver.aggregateRemoteArtifactRepositories( externalRepos, Collections.singleton( project ) ); + mm.replayAll(); - assertRepositoryWithId( er1.getId(), aggregated, true ); - assertRepositoryWithId( er2.getId(), aggregated, true ); - assertRepositoryWithId( pr1.getId(), aggregated, true ); - assertRepositoryWithId( pr2.getId(), aggregated, false ); - } + resolver.updateModuleSetResolutionRequirements( ms, new DependencySet(), info, cs ); + assertEquals( module1Artifacts, info.getArtifacts() ); - // public void test_manageArtifact() - // { - // Artifact managed = factory.createArtifact( "group", "artifact", "1", Artifact.SCOPE_PROVIDED, "jar" ); - // - // Artifact target = - // factory.createArtifact( managed.getGroupId(), managed.getArtifactId(), "2", Artifact.SCOPE_COMPILE, - // managed.getType() ); - // - // Artifact target2 = - // factory.createArtifact( "other-group", managed.getArtifactId(), "2", Artifact.SCOPE_COMPILE, - // managed.getType() ); - // - // Map managedVersions = Collections.singletonMap( managed.getDependencyConflictId(), managed ); - // - // DefaultDependencyResolver resolver = - // new DefaultDependencyResolver().setLogger( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ); - // - // resolver.manageArtifact( target, managedVersions ); - // resolver.manageArtifact( target2, managedVersions ); - // - // assertEquals( managed.getVersion(), target.getVersion() ); - // assertEquals( managed.getScope(), target.getScope() ); - // - // assertEquals( "2", target2.getVersion() ); - // assertEquals( Artifact.SCOPE_COMPILE, target2.getScope() ); - // } - - // public void test_buildManagedVersionMap_NonTransitiveResolution() - // throws ArtifactResolutionException, ArchiveCreationException, InvalidVersionSpecificationException, - // InvalidDependencyVersionException - // { - // Assembly assembly = new Assembly(); - // - // DependencySet ds = new DependencySet(); - // ds.setScope( Artifact.SCOPE_PROVIDED ); - // ds.setUseTransitiveDependencies( false ); - // - // assembly.addDependencySet( ds ); - // - // ModuleSet ms = new ModuleSet(); - // ModuleBinaries mb = new ModuleBinaries(); - // ms.setBinaries( mb ); - // - // DependencySet mds = new DependencySet(); - // mds.setScope( Artifact.SCOPE_PROVIDED ); - // mds.setUseTransitiveDependencies( false ); - // - // mb.addDependencySet( mds ); - // - // assembly.addModuleSet( ms ); - // - // MavenProject project = createMavenProject( "group", "artifact", "1", new File( "base" ) ); - // - // Dependency d1 = new Dependency(); - // d1.setGroupId( "group.dep" ); - // d1.setArtifactId( "dep1" ); - // d1.setVersion( "1" ); - // d1.setScope( Artifact.SCOPE_COMPILE ); - // - // project.getModel().addDependency( d1 ); - // - // Dependency d2 = new Dependency(); - // d2.setGroupId( "group.dep" ); - // d2.setArtifactId( "dep2" ); - // d2.setVersion( "1" ); - // d2.setScope( Artifact.SCOPE_PROVIDED ); - // - // project.getModel().addDependency( d2 ); - // - // Dependency d3 = new Dependency(); - // d3.setGroupId( "group.dep" ); - // d3.setArtifactId( "dep3" ); - // d3.setVersion( "1" ); - // d3.setScope( Artifact.SCOPE_PROVIDED ); - // - // project.getModel().addDependency( d3 ); - // - // MavenProject module = createMavenProject( "group", "module", "1", new File( "base/module" ) ); - // - // project.getModel().addModule( module.getArtifactId() ); - // - // Dependency md = new Dependency(); - // md.setGroupId( "group.dep" ); - // md.setArtifactId( "dep3" ); - // md.setVersion( "2" ); - // md.setScope( Artifact.SCOPE_PROVIDED ); - // - // module.getModel().addDependency( md ); - // - // List allProjects = new ArrayList(); - // allProjects.add( project ); - // allProjects.add( module ); - // - // MockManager mm = new MockManager(); - // - // MockControl csControl = MockControl.createControl( AssemblerConfigurationSource.class ); - // mm.add( csControl ); - // - // AssemblerConfigurationSource cs = (AssemblerConfigurationSource) csControl.getMock(); - // - // cs.getProject(); - // csControl.setReturnValue( project, MockControl.ZERO_OR_MORE ); - // - // cs.getReactorProjects(); - // csControl.setReturnValue( allProjects, MockControl.ZERO_OR_MORE ); - // - // cs.getRemoteRepositories(); - // csControl.setReturnValue( Collections.EMPTY_LIST, MockControl.ZERO_OR_MORE ); - // - // mm.replayAll(); - // - // DefaultDependencyResolver resolver = new DefaultDependencyResolver(); - // resolver.setArtifactFactory( factory ); - // resolver.setLogger( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ); - // - // Map managedVersionMap = resolver.buildManagedVersionMap( assembly, cs ); - // - // { - // Dependency d = d1; - // Artifact a = (Artifact) managedVersionMap.get( d.getManagementKey() ); - // assertNull( a ); - // } - // - // { - // Dependency d = d2; - // Artifact a = (Artifact) managedVersionMap.get( d.getManagementKey() ); - // assertNotNull( a ); - // assertEquals( d.getVersion(), a.getVersion() ); - // assertEquals( d.getScope(), a.getScope() ); - // } - // - // { - // Dependency d = d3; - // Artifact a = (Artifact) managedVersionMap.get( d.getManagementKey() ); - // assertNotNull( a ); - // assertEquals( d.getVersion(), a.getVersion() ); - // assertEquals( d.getScope(), a.getScope() ); - // } - // - // mm.verifyAll(); - // } - // - // public void test_buildManagedVersionMap_TransitiveResolution() - // throws ArtifactResolutionException, ArchiveCreationException, InvalidVersionSpecificationException, - // InvalidDependencyVersionException - // { - // Assembly assembly = new Assembly(); - // - // DependencySet ds = new DependencySet(); - // ds.setScope( Artifact.SCOPE_COMPILE ); - // ds.setUseTransitiveDependencies( true ); - // - // assembly.addDependencySet( ds ); - // - // MavenProject project = createMavenProject( "group", "artifact", "1", new File( "base" ) ); - // - // Dependency d1 = new Dependency(); - // d1.setGroupId( "group.dep" ); - // d1.setArtifactId( "dep1" ); - // d1.setVersion( "1" ); - // d1.setScope( Artifact.SCOPE_COMPILE ); - // - // project.getModel().addDependency( d1 ); - // - // Dependency d2 = new Dependency(); - // d2.setGroupId( "group.dep" ); - // d2.setArtifactId( "dep2" ); - // d2.setVersion( "1" ); - // d2.setScope( Artifact.SCOPE_COMPILE ); - // final Artifact a2 = factory.createArtifact( d2.getGroupId(), d2.getArtifactId(), d2.getVersion(), d2.getScope(), - // "jar" ); - // - // project.getModel().addDependency( d2 ); - // - // Dependency d3 = new Dependency(); - // d3.setGroupId( "group.dep" ); - // d3.setArtifactId( "dep3" ); - // d3.setVersion( "1" ); - // d3.setScope( Artifact.SCOPE_COMPILE ); - // - // project.getModel().addDependency( d3 ); - // - // final Artifact a2a = factory.createArtifact( d3.getGroupId(), d3.getArtifactId(), "2", Artifact.SCOPE_RUNTIME, - // "jar" ); - // - // MockManager mm = new MockManager(); - // - // MockControl msControl = MockControl.createControl( ArtifactMetadataSource.class ); - // mm.add( msControl ); - // - // ArtifactMetadataSource ms = (ArtifactMetadataSource) msControl.getMock(); - // - // try - // { - // ms.retrieve( null, null, null ); - // } - // catch ( ArtifactMetadataRetrievalException e ) - // { - // } - // - // msControl.setDefaultReturnValue( new ResolutionGroup( null, Collections.EMPTY_SET, Collections.EMPTY_LIST ) ); - // msControl.setMatcher( new ArgumentsMatcher() - // { - // public boolean matches( Object[] expected, Object[] actual ) - // { - // Artifact a = (Artifact) actual[0]; - // - // return a2.getArtifactId().equals( a.getArtifactId() ); - // } - // - // public String toString( Object[] args ) - // { - // return "with artifact: " + args[0] ; - // } - // - // } ); - // msControl.setReturnValue( new ResolutionGroup( a2, Collections.singleton( a2a ), Collections.EMPTY_LIST ) ); - // - // - // MockControl csControl = MockControl.createControl( AssemblerConfigurationSource.class ); - // mm.add( csControl ); - // - // AssemblerConfigurationSource cs = (AssemblerConfigurationSource) csControl.getMock(); - // - // cs.getProject(); - // csControl.setReturnValue( project, MockControl.ZERO_OR_MORE ); - // - // String tmpDir = System.getProperty( "java.io.tmpdir" ); - // ArtifactRepository lr = repoFactory.createArtifactRepository( "local", "file://" + tmpDir, layout, null, null ); - // - // cs.getLocalRepository(); - // csControl.setReturnValue( lr, MockControl.ZERO_OR_MORE ); - // - // cs.getRemoteRepositories(); - // csControl.setReturnValue( Collections.EMPTY_LIST, MockControl.ZERO_OR_MORE ); - // - // mm.replayAll(); - // - // DefaultDependencyResolver resolver = new DefaultDependencyResolver(); - // resolver.setArtifactMetadataSource( ms ); - // resolver.setArtifactCollector( collector ); - // resolver.setArtifactFactory( factory ); - // resolver.setLogger( new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ); - // - // Map managedVersionMap = resolver.buildManagedVersionMap( assembly, cs ); - // - // { - // Dependency d = d1; - // Artifact a = (Artifact) managedVersionMap.get( d.getManagementKey() ); - // assertNotNull( a ); - // assertEquals( d.getVersion(), a.getVersion() ); - // assertEquals( d.getScope(), a.getScope() ); - // } - // - // { - // Dependency d = d2; - // Artifact a = (Artifact) managedVersionMap.get( d.getManagementKey() ); - // assertNotNull( a ); - // assertEquals( d.getVersion(), a.getVersion() ); - // assertEquals( d.getScope(), a.getScope() ); - // } - // - // { - // Dependency d = d3; - // Artifact a = (Artifact) managedVersionMap.get( d.getManagementKey() ); - // assertNotNull( a ); - // assertEquals( d.getVersion(), a.getVersion() ); - // assertEquals( d.getScope(), a.getScope() ); - // } - // - // mm.verifyAll(); - // } - - private void assertRepositoryWithId( final String repoId, final List<ArtifactRepository> repos, - final boolean shouldExist ) - { - if ( ( repos == null || repos.isEmpty() ) ) - { - if ( shouldExist ) - { - fail( "Repository with id: " + repoId + " should be present, but repository list is null or empty." ); - } - } - else - { - boolean found = false; - for ( final ArtifactRepository repo : repos ) - { - if ( repoId.equals( repo.getId() ) ) - { - found = true; - break; - } - } - - if ( shouldExist ) - { - assertTrue( "Repository with id: " + repoId + " should be present in repository list.", found ); - } - else - { - assertFalse( "Repository with id: " + repoId + " should NOT be present in repository list.", found ); - } - } + mm.verifyAll(); } private MavenProject createMavenProject( final String groupId, final String artifactId, final String version, @@ -635,12 +209,20 @@ public class DefaultDependencyResolverTest final MavenProject project = new MavenProject( model ); - final Artifact pomArtifact = factory.createProjectArtifact( groupId, artifactId, version ); + final Artifact pomArtifact = newArtifact( groupId, artifactId, version ); project.setArtifact( pomArtifact ); + project.setArtifacts( new HashSet<Artifact>() ); + project.setDependencyArtifacts( new HashSet<Artifact>() ); project.setFile( new File( basedir, "pom.xml" ) ); return project; } + private Artifact newArtifact( final String groupId, final String artifactId, final String version ) + { + return new DefaultArtifact( groupId, artifactId, VersionRange.createFromVersion( version ), "compile", "jar", + null, new DefaultArtifactHandler() ); + } + } diff --git a/src/test/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfoTest.java b/src/test/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfoTest.java index ede62bc..86c2b71 100644 --- a/src/test/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfoTest.java +++ b/src/test/java/org/apache/maven/plugins/assembly/artifact/ResolutionManagementInfoTest.java @@ -24,7 +24,6 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.artifact.versioning.VersionRange; -import org.apache.maven.project.MavenProject; import java.util.Arrays; import java.util.Collections; @@ -43,7 +42,7 @@ public class ResolutionManagementInfoTest public void testAddSingleArtifactWithReplacemen() throws Exception { - ResolutionManagementInfo rmi = new ResolutionManagementInfo( new MavenProject() ); + ResolutionManagementInfo rmi = new ResolutionManagementInfo(); Artifact a1 = new DefaultArtifact( "groupid", "1", VersionRange.createFromVersion( "1.0" ), "test", "jar", null, new DefaultArtifactHandler() ); rmi.addArtifacts( Collections.singleton( a1 ) ); @@ -59,7 +58,7 @@ public class ResolutionManagementInfoTest public void testAddMultiArtifactWithReplacemen() throws Exception { - ResolutionManagementInfo rmi = new ResolutionManagementInfo( new MavenProject() ); + ResolutionManagementInfo rmi = new ResolutionManagementInfo(); Artifact a1 = new DefaultArtifact( "groupid", "a1", VersionRange.createFromVersion( "1.0" ), "test", "jar", null, new DefaultArtifactHandler() ); -- To stop receiving notification emails like this one, please contact gb...@apache.org.