1 package org.apache.maven.shared.artifact.resolver;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertNotNull;
24 import static org.junit.Assert.assertTrue;
25 import static junit.framework.Assert.fail;
26
27 import org.apache.maven.ProjectDependenciesResolver;
28 import org.apache.maven.artifact.Artifact;
29 import org.apache.maven.artifact.factory.ArtifactFactory;
30 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
31 import org.apache.maven.artifact.repository.ArtifactRepository;
32 import org.apache.maven.artifact.repository.DefaultArtifactRepository;
33 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
34 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
35 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
36 import org.apache.maven.artifact.resolver.ArtifactResolver;
37 import org.apache.maven.execution.MavenSession;
38 import org.apache.maven.model.Model;
39 import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
40 import org.apache.maven.project.DefaultProjectBuilderConfiguration;
41 import org.apache.maven.project.MavenProject;
42 import org.apache.maven.project.MavenProjectBuilder;
43 import org.apache.maven.project.ProjectBuilderConfiguration;
44 import org.apache.maven.project.ProjectBuildingException;
45 import org.apache.maven.settings.Settings;
46 import org.apache.maven.shared.artifact.resolver.testutil.ModelCreator;
47 import org.apache.maven.shared.utils.io.FileUtils;
48 import org.apache.maven.shared.utils.io.IOUtil;
49 import org.codehaus.plexus.DefaultPlexusContainer;
50 import org.codehaus.plexus.PlexusContainer;
51 import org.codehaus.plexus.PlexusContainerException;
52 import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
53 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
54 import org.junit.AfterClass;
55 import org.junit.BeforeClass;
56 import org.junit.Test;
57
58 import java.io.File;
59 import java.io.FileWriter;
60 import java.io.IOException;
61 import java.util.Collection;
62 import java.util.Collections;
63 import java.util.LinkedHashSet;
64 import java.util.Set;
65
66
67 public class DefaultProjectDependenciesResolverIT
68 {
69
70 private static PlexusContainer container;
71
72 private static ArtifactResolver artifactResolver;
73
74 private static ArtifactMetadataSource metadataSource;
75
76 private static ArtifactFactory artifactFactory;
77
78 private static MavenProjectBuilder projectBuilder;
79
80 private static DefaultProjectDependenciesResolver resolver;
81
82 private static MavenSession session;
83
84 private static File localRepoDir;
85
86 private static File pomsDir;
87
88 private static ProjectBuilderConfiguration pbConfig;
89
90 @Test
91 public void resolveSingleDependency_SingleProject_CompileScope()
92 throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
93 {
94 String gid = "org.codehaus.plexus";
95 String aid = "plexus-utils";
96 String version = "1.5.15";
97
98 Model model = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
99
100 MavenProject project = writeAndBuild( model, "pom.1dep-1project-compile-scope.xml" );
101
102 Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
103
104 Set<Artifact> result = resolver.resolve( project, scopes, session );
105
106 assertSingleArtifact( result, gid, aid, version );
107 }
108
109 @Test
110 public void resolveUsingDependencyManagementForTransitives_SingleProject_CompileScope()
111 throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
112 {
113 String gid = "org.apache.maven";
114 String aid = "maven-project";
115 String version = "2.2.1";
116
117 String maid = "maven-model";
118 String mversion = "2.1.0";
119
120 Model model = new ModelCreator().withDefaultCoordinate()
121 .withDependency( gid, aid, version )
122 .withManagedDependency( gid, maid, mversion )
123 .getModel();
124
125 MavenProject project = writeAndBuild( model, "pom.managed-transitive-dep-1project-compile-scope.xml" );
126
127 Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
128
129 Set<Artifact> result = resolver.resolve( project, scopes, session );
130
131 assertNotNull( result );
132
133
134
135
136
137
138
139 assertArtifactPresent( result, gid, aid, version );
140 assertArtifactPresent( result, gid, maid, mversion );
141 }
142
143 @Test
144 public void resolveUsingDependencyManagementIntermittently_TwoProjects_CompileScope_FirstWins()
145 throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
146 {
147 String gid = "org.apache.maven";
148 String aid = "maven-project";
149 String version = "2.2.1";
150
151 String maid = "maven-model";
152 String mversion = "2.1.0";
153
154 Model model1 = new ModelCreator().withDefaultCoordinate()
155 .withDependency( gid, aid, version )
156 .withManagedDependency( gid, maid, mversion )
157 .getModel();
158
159 MavenProject project1 = writeAndBuild( model1, "pom.managed-transitive-dep-2proj-compile-scope-A.xml" );
160
161 Model model2 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
162 MavenProject project2 = writeAndBuild( model2, "pom.managed-transitive-dep-2proj-compile-scope-B.xml" );
163
164 Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
165 projects.add( project1 );
166 projects.add( project2 );
167
168 Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
169
170 Set<Artifact> result = resolver.resolve( projects, scopes, session );
171
172 assertNotNull( result );
173
174
175
176
177
178
179
180 assertArtifactPresent( result, gid, aid, version );
181 assertArtifactPresent( result, gid, maid, mversion );
182 }
183
184 private void assertArtifactPresent( Set<Artifact> result, String gid, String aid, String version )
185 {
186 for ( Artifact artifact : result )
187 {
188 if ( gid.equals( artifact.getGroupId() ) && aid.equals( artifact.getArtifactId() )
189 && version.equals( artifact.getVersion() ) )
190 {
191 return;
192 }
193 }
194
195 fail( "Did not find required artifact: " + gid + ":" + aid + ":" + version + " in resolution result." );
196 }
197
198 @Test
199 public void resolveSingleDependency_TwoProjects_CompileScope()
200 throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
201 {
202 String gid = "org.codehaus.plexus";
203 String aid = "plexus-utils";
204 String version = "1.5.15";
205
206 Model model1 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
207 MavenProject project1 = writeAndBuild( model1, "pom.1dep-2proj-compile-scope-A.xml" );
208
209 Model model2 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
210 MavenProject project2 = writeAndBuild( model2, "pom.1dep-2proj-compile-scope-B.xml" );
211
212 Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
213 projects.add( project1 );
214 projects.add( project2 );
215
216 Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
217
218 Set<Artifact> result = resolver.resolve( projects, scopes, session );
219
220 assertSingleArtifact( result, gid, aid, version );
221 }
222
223 @Test
224 public void resolveSingleDependency_TwoVersions_TwoProjects_CompileScope_FirstWins()
225 throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
226 {
227 String gid = "org.codehaus.plexus";
228 String aid = "plexus-utils";
229 String version = "1.5.15";
230
231 Model model1 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
232 MavenProject project1 = writeAndBuild( model1, "pom.1dep-2proj-compile-scope-A.xml" );
233
234 String version2 = "1.5.14";
235
236 Model model2 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version2 ).getModel();
237 MavenProject project2 = writeAndBuild( model2, "pom.1dep-2proj-compile-scope-B.xml" );
238
239 Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
240 projects.add( project1 );
241 projects.add( project2 );
242
243 Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
244
245 Set<Artifact> result = resolver.resolve( projects, scopes, session );
246
247 assertSingleArtifact( result, gid, aid, version );
248 }
249
250 @Test
251 public void ignoreUnbuiltInterdependency()
252 throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
253 {
254 String gid = "org.codehaus.plexus";
255 String aid = "plexus-utils";
256 String version = "1.5.15";
257
258 Model model1 = new ModelCreator().withDefaultCoordinate().withArtifactId( "child1" ).withDependency( gid, aid, version )
259 .getModel();
260 MavenProject project1 = writeAndBuild( model1, "pom.interdep-child-1.xml" );
261
262 Model model2 = new ModelCreator().withDefaultCoordinate().withArtifactId( "child2" ).withDependency( model1.getGroupId(),
263 model1.getArtifactId(),
264 model1.getVersion() )
265 .getModel();
266
267 MavenProject project2 = writeAndBuild( model2, "pom.interdep-child-2.xml" );
268
269 Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
270 projects.add( project1 );
271 projects.add( project2 );
272
273 Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
274
275 Set<Artifact> result = resolver.resolve( projects, scopes, session );
276
277 assertSingleArtifact( result, gid, aid, version );
278 }
279
280 private void assertSingleArtifact( Set<Artifact> result, String gid, String aid, String version )
281 {
282 assertNotNull( result );
283 assertEquals( 1, result.size() );
284
285 Artifact a = result.iterator().next();
286 assertEquals( gid, a.getGroupId() );
287 assertEquals( aid, a.getArtifactId() );
288 assertEquals( version, a.getVersion() );
289
290 assertTrue( a.isResolved() );
291 assertTrue( a.getFile().exists() );
292 }
293
294 private MavenProject writeAndBuild( Model model, String filename )
295 throws IOException, ProjectBuildingException
296 {
297 File pomFile = new File( pomsDir, filename );
298
299 FileWriter writer = null;
300 try
301 {
302 writer = new FileWriter( pomFile );
303 new MavenXpp3Writer().write( writer, model );
304 }
305 finally
306 {
307 IOUtil.close( writer );
308 }
309
310 return projectBuilder.build( pomFile, pbConfig );
311 }
312
313 @BeforeClass
314 public static void bootstrap()
315 throws PlexusContainerException, ComponentLookupException, IOException
316 {
317 container = new DefaultPlexusContainer();
318 container.initialize();
319 container.start();
320
321 artifactResolver = (ArtifactResolver) container.lookup( ArtifactResolver.class.getName() );
322 metadataSource = (ArtifactMetadataSource) container.lookup( ArtifactMetadataSource.class.getName(), "maven" );
323 artifactFactory = (ArtifactFactory) container.lookup( ArtifactFactory.class.getName() );
324 projectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.class.getName() );
325
326 resolver = (DefaultProjectDependenciesResolver) container.lookup( ProjectDependenciesResolver.class.getName(), "default" );
327
328 localRepoDir = newTempDir( "local-repo" );
329 pomsDir = newTempDir( "poms" );
330
331 ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.class.getName(), "default" );
332
333 String localRepoUrl = "file://" + localRepoDir.getAbsoluteFile().toURI().getPath();
334 ArtifactRepository localRepo = new DefaultArtifactRepository( "local", localRepoUrl, layout );
335
336 session = new MavenSession( container, new Settings(), localRepo, null, null, null, null, null, null );
337
338 pbConfig = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepo );
339 }
340
341 private static File newTempDir( String basename )
342 throws IOException
343 {
344 File dir = File.createTempFile( basename + ".", ".dir" );
345 dir.delete();
346 dir.mkdirs();
347
348 return dir;
349 }
350
351 @AfterClass
352 public static void shutdown()
353 {
354 try
355 {
356 container.release( resolver );
357 container.release( artifactResolver );
358 container.release( metadataSource );
359 container.release( artifactFactory );
360 container.release( projectBuilder );
361
362 container.dispose();
363 }
364 catch ( ComponentLifecycleException e )
365 {
366 }
367
368 try
369 {
370 FileUtils.forceDelete( localRepoDir );
371 FileUtils.forceDelete( pomsDir );
372 }
373 catch ( IOException e )
374 {
375 }
376 }
377
378 }