1 package org.apache.maven.plugins.dependency.fromDependencies;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.LinkedHashSet;
26 import java.util.Set;
27
28 import org.apache.maven.artifact.Artifact;
29 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
30 import org.apache.maven.plugin.MojoExecutionException;
31 import org.apache.maven.plugins.annotations.Component;
32 import org.apache.maven.plugins.annotations.Parameter;
33 import org.apache.maven.plugins.dependency.AbstractDependencyMojo;
34 import org.apache.maven.plugins.dependency.utils.DependencyStatusSets;
35 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
36 import org.apache.maven.plugins.dependency.utils.translators.ArtifactTranslator;
37 import org.apache.maven.plugins.dependency.utils.translators.ClassifierTypeTranslator;
38 import org.apache.maven.project.MavenProject;
39 import org.apache.maven.project.ProjectBuilder;
40 import org.apache.maven.project.ProjectBuildingException;
41 import org.apache.maven.project.ProjectBuildingRequest;
42 import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
43 import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
44 import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
45 import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
46 import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
47 import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
48 import org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
49 import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
50 import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
51 import org.apache.maven.shared.transfer.artifact.ArtifactCoordinate;
52 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
53 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
54 import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver;
55 import org.apache.maven.shared.transfer.repository.RepositoryManager;
56 import org.codehaus.plexus.util.StringUtils;
57
58
59
60
61
62
63
64 public abstract class AbstractDependencyFilterMojo
65 extends AbstractDependencyMojo
66 {
67 @Component
68 private ArtifactResolver artifactResolver;
69
70 @Component
71 private DependencyResolver dependencyResolver;
72
73 @Component
74 private RepositoryManager repositoryManager;
75
76
77
78
79
80
81 @Parameter( property = "overWriteReleases", defaultValue = "false" )
82 protected boolean overWriteReleases;
83
84
85
86
87
88
89 @Parameter( property = "overWriteSnapshots", defaultValue = "false" )
90 protected boolean overWriteSnapshots;
91
92
93
94
95
96
97 @Parameter( property = "overWriteIfNewer", defaultValue = "true" )
98 protected boolean overWriteIfNewer;
99
100
101
102
103
104
105 @Parameter( property = "excludeTransitive", defaultValue = "false" )
106 protected boolean excludeTransitive;
107
108
109
110
111
112
113 @Parameter( property = "includeTypes", defaultValue = "" )
114 protected String includeTypes;
115
116
117
118
119
120
121 @Parameter( property = "excludeTypes", defaultValue = "" )
122 protected String excludeTypes;
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 @Parameter( property = "includeScope", defaultValue = "" )
139 protected String includeScope;
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 @Parameter( property = "excludeScope", defaultValue = "" )
158 protected String excludeScope;
159
160
161
162
163
164
165 @Parameter( property = "includeClassifiers", defaultValue = "" )
166 protected String includeClassifiers;
167
168
169
170
171
172
173 @Parameter( property = "excludeClassifiers", defaultValue = "" )
174 protected String excludeClassifiers;
175
176
177
178
179
180
181 @Parameter( property = "classifier", defaultValue = "" )
182 protected String classifier;
183
184
185
186
187
188
189 @Parameter( property = "type", defaultValue = "" )
190 protected String type;
191
192
193
194
195
196
197 @Parameter( property = "excludeArtifactIds", defaultValue = "" )
198 protected String excludeArtifactIds;
199
200
201
202
203
204
205 @Parameter( property = "includeArtifactIds", defaultValue = "" )
206 protected String includeArtifactIds;
207
208
209
210
211
212
213 @Parameter( property = "excludeGroupIds", defaultValue = "" )
214 protected String excludeGroupIds;
215
216
217
218
219
220
221 @Parameter( property = "includeGroupIds", defaultValue = "" )
222 protected String includeGroupIds;
223
224
225
226
227
228
229
230 @Parameter( property = "markersDirectory", defaultValue = "${project.build.directory}/dependency-maven-plugin-markers" )
231
232 protected File markersDirectory;
233
234
235
236
237
238
239 @Parameter( property = "mdep.prependGroupId", defaultValue = "false" )
240 protected boolean prependGroupId = false;
241
242 @Component
243 private ProjectBuilder projectBuilder;
244
245 @Component
246 private ArtifactHandlerManager artifactHandlerManager;
247
248
249
250
251
252
253 protected abstract ArtifactsFilter getMarkedArtifactFilter();
254
255
256
257
258
259
260
261
262 protected Set<Artifact> getResolvedDependencies( boolean stopOnFailure )
263 throws MojoExecutionException
264
265 {
266 DependencyStatusSets status = getDependencySets( stopOnFailure );
267
268 return status.getResolvedDependencies();
269 }
270
271
272
273
274
275
276 protected DependencyStatusSets getDependencySets( boolean stopOnFailure )
277 throws MojoExecutionException
278 {
279 return getDependencySets( stopOnFailure, false );
280 }
281
282
283
284
285
286
287
288
289
290
291 protected DependencyStatusSets getDependencySets( boolean stopOnFailure, boolean includeParents )
292 throws MojoExecutionException
293 {
294
295 FilterArtifacts filter = new FilterArtifacts();
296
297 filter.addFilter( new ProjectTransitivityFilter( getProject().getDependencyArtifacts(),
298 this.excludeTransitive ) );
299
300 if ( "test".equals( this.excludeScope ) )
301 {
302 throw new MojoExecutionException( "Excluding every artifact inside 'test' resolution scope means "
303 + "excluding everything: you probably want includeScope='compile', "
304 + "read parameters documentation for detailed explanations" );
305 }
306 filter.addFilter( new ScopeFilter( DependencyUtil.cleanToBeTokenizedString( this.includeScope ),
307 DependencyUtil.cleanToBeTokenizedString( this.excludeScope ) ) );
308
309 filter.addFilter( new TypeFilter( DependencyUtil.cleanToBeTokenizedString( this.includeTypes ),
310 DependencyUtil.cleanToBeTokenizedString( this.excludeTypes ) ) );
311
312 filter.addFilter( new ClassifierFilter( DependencyUtil.cleanToBeTokenizedString( this.includeClassifiers ),
313 DependencyUtil.cleanToBeTokenizedString( this.excludeClassifiers ) ) );
314
315 filter.addFilter( new GroupIdFilter( DependencyUtil.cleanToBeTokenizedString( this.includeGroupIds ),
316 DependencyUtil.cleanToBeTokenizedString( this.excludeGroupIds ) ) );
317
318 filter.addFilter( new ArtifactIdFilter( DependencyUtil.cleanToBeTokenizedString( this.includeArtifactIds ),
319 DependencyUtil.cleanToBeTokenizedString( this.excludeArtifactIds ) ) );
320
321
322 Set<Artifact> artifacts = getProject().getArtifacts();
323
324 if ( includeParents )
325 {
326
327 for ( Artifact dep : new ArrayList<>( artifacts ) )
328 {
329 addParentArtifacts( buildProjectFromArtifact( dep ), artifacts );
330 }
331
332
333 addParentArtifacts( getProject(), artifacts );
334 }
335
336
337 try
338 {
339 artifacts = filter.filter( artifacts );
340 }
341 catch ( ArtifactFilterException e )
342 {
343 throw new MojoExecutionException( e.getMessage(), e );
344 }
345
346
347 DependencyStatusSets status;
348 if ( StringUtils.isNotEmpty( classifier ) )
349 {
350 status = getClassifierTranslatedDependencies( artifacts, stopOnFailure );
351 }
352 else
353 {
354 status = filterMarkedDependencies( artifacts );
355 }
356
357 return status;
358 }
359
360 private MavenProject buildProjectFromArtifact( Artifact artifact )
361 throws MojoExecutionException
362 {
363 try
364 {
365 return projectBuilder.build( artifact, session.getProjectBuildingRequest() ).getProject();
366 }
367 catch ( ProjectBuildingException e )
368 {
369 throw new MojoExecutionException( e.getMessage(), e );
370 }
371 }
372
373 private void addParentArtifacts( MavenProject project, Set<Artifact> artifacts )
374 throws MojoExecutionException
375 {
376 while ( project.hasParent() )
377 {
378 project = project.getParent();
379
380 if ( artifacts.contains( project.getArtifact() ) )
381 {
382
383 break;
384 }
385 try
386 {
387 ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
388
389 Artifact resolvedArtifact =
390 artifactResolver.resolveArtifact( buildingRequest, project.getArtifact() ).getArtifact();
391
392 artifacts.add( resolvedArtifact );
393 }
394 catch ( ArtifactResolverException e )
395 {
396 throw new MojoExecutionException( e.getMessage(), e );
397 }
398 }
399 }
400
401
402
403
404
405
406
407
408
409 protected DependencyStatusSets getClassifierTranslatedDependencies( Set<Artifact> artifacts, boolean stopOnFailure )
410 throws MojoExecutionException
411 {
412 Set<Artifact> unResolvedArtifacts = new LinkedHashSet<>();
413 Set<Artifact> resolvedArtifacts = artifacts;
414 DependencyStatusSets status = new DependencyStatusSets();
415
416
417
418
419 if ( StringUtils.isNotEmpty( classifier ) )
420 {
421 ArtifactTranslator translator =
422 new ClassifierTypeTranslator( artifactHandlerManager, this.classifier, this.type );
423 Collection<ArtifactCoordinate> coordinates = translator.translate( artifacts, getLog() );
424
425 status = filterMarkedDependencies( artifacts );
426
427
428 artifacts = status.getResolvedDependencies();
429
430
431 resolvedArtifacts = resolve( new LinkedHashSet<>( coordinates ), stopOnFailure );
432
433
434 unResolvedArtifacts.addAll( artifacts );
435 unResolvedArtifacts.removeAll( resolvedArtifacts );
436 }
437
438
439 status.setResolvedDependencies( resolvedArtifacts );
440 status.setUnResolvedDependencies( unResolvedArtifacts );
441
442 return status;
443 }
444
445
446
447
448
449
450
451
452 protected DependencyStatusSets filterMarkedDependencies( Set<Artifact> artifacts )
453 throws MojoExecutionException
454 {
455
456 FilterArtifacts filter = new FilterArtifacts();
457 filter.clearFilters();
458 filter.addFilter( getMarkedArtifactFilter() );
459
460 Set<Artifact> unMarkedArtifacts;
461 try
462 {
463 unMarkedArtifacts = filter.filter( artifacts );
464 }
465 catch ( ArtifactFilterException e )
466 {
467 throw new MojoExecutionException( e.getMessage(), e );
468 }
469
470
471 Set<Artifact> skippedArtifacts = new LinkedHashSet<>();
472 skippedArtifacts.addAll( artifacts );
473 skippedArtifacts.removeAll( unMarkedArtifacts );
474
475 return new DependencyStatusSets( unMarkedArtifacts, null, skippedArtifacts );
476 }
477
478
479
480
481
482
483
484
485 protected Set<Artifact> resolve( Set<ArtifactCoordinate> coordinates, boolean stopOnFailure )
486 throws MojoExecutionException
487 {
488 ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
489
490 Set<Artifact> resolvedArtifacts = new LinkedHashSet<>();
491 for ( ArtifactCoordinate coordinate : coordinates )
492 {
493 try
494 {
495 Artifact artifact = artifactResolver.resolveArtifact( buildingRequest, coordinate ).getArtifact();
496 resolvedArtifacts.add( artifact );
497 }
498 catch ( ArtifactResolverException ex )
499 {
500
501 getLog().debug( "error resolving: " + coordinate );
502 getLog().debug( ex );
503 if ( stopOnFailure )
504 {
505 throw new MojoExecutionException( "error resolving: " + coordinate, ex );
506 }
507 }
508 }
509 return resolvedArtifacts;
510 }
511
512
513
514
515 public File getMarkersDirectory()
516 {
517 return this.markersDirectory;
518 }
519
520
521
522
523 public void setMarkersDirectory( File theMarkersDirectory )
524 {
525 this.markersDirectory = theMarkersDirectory;
526 }
527
528
529
530
531
532
533 public boolean isPrependGroupId()
534 {
535 return prependGroupId;
536 }
537
538
539
540
541 public void setPrependGroupId( boolean prependGroupId )
542 {
543 this.prependGroupId = prependGroupId;
544 }
545
546
547
548
549 protected final ArtifactResolver getArtifactResolver()
550 {
551 return artifactResolver;
552 }
553
554
555
556
557 protected final DependencyResolver getDependencyResolver()
558 {
559 return dependencyResolver;
560 }
561
562
563
564
565 protected final RepositoryManager getRepositoryManager()
566 {
567 return repositoryManager;
568 }
569 }