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