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.fromConfiguration;
20
21 import java.io.File;
22 import java.util.Collections;
23 import java.util.List;
24 import java.util.Objects;
25
26 import org.apache.commons.lang3.StringUtils;
27 import org.apache.maven.RepositoryUtils;
28 import org.apache.maven.artifact.Artifact;
29 import org.apache.maven.artifact.handler.ArtifactHandler;
30 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
31 import org.apache.maven.execution.MavenSession;
32 import org.apache.maven.model.Dependency;
33 import org.apache.maven.plugin.MojoExecutionException;
34 import org.apache.maven.plugin.MojoFailureException;
35 import org.apache.maven.plugins.annotations.Parameter;
36 import org.apache.maven.plugins.dependency.AbstractDependencyMojo;
37 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
38 import org.apache.maven.plugins.dependency.utils.filters.ArtifactItemFilter;
39 import org.apache.maven.project.MavenProject;
40 import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
41 import org.eclipse.aether.DefaultRepositoryCache;
42 import org.eclipse.aether.DefaultRepositorySystemSession;
43 import org.eclipse.aether.RepositorySystem;
44 import org.eclipse.aether.RepositorySystemSession;
45 import org.eclipse.aether.artifact.DefaultArtifact;
46 import org.eclipse.aether.repository.LocalRepository;
47 import org.eclipse.aether.repository.LocalRepositoryManager;
48 import org.eclipse.aether.resolution.ArtifactRequest;
49 import org.eclipse.aether.resolution.ArtifactResolutionException;
50 import org.eclipse.aether.resolution.ArtifactResult;
51 import org.sonatype.plexus.build.incremental.BuildContext;
52
53
54
55
56
57
58
59
60 public abstract class AbstractFromConfigurationMojo extends AbstractDependencyMojo {
61
62
63
64
65
66 @Parameter(property = "outputDirectory", defaultValue = "${project.build.directory}/dependency")
67 private File outputDirectory;
68
69
70
71
72
73
74 @Parameter(property = "mdep.overWriteReleases", defaultValue = "false")
75 private boolean overWriteReleases;
76
77
78
79
80
81
82 @Parameter(property = "mdep.overWriteSnapshots", defaultValue = "false")
83 private boolean overWriteSnapshots;
84
85
86
87
88
89
90
91 @Deprecated
92 @Parameter(property = "mdep.overIfNewer", defaultValue = "true")
93 private boolean overIfNewer;
94
95
96
97
98
99
100 @Parameter(property = "mdep.overWriteIfNewer", defaultValue = "true")
101 private boolean overWriteIfNewer;
102
103
104
105
106
107
108
109 @Parameter
110 private List<ArtifactItem> artifactItems;
111
112
113
114
115
116
117
118 @Parameter
119 private File localRepositoryDirectory;
120
121 private final ArtifactHandlerManager artifactHandlerManager;
122
123 private final RepositorySystem repositorySystem;
124
125 protected AbstractFromConfigurationMojo(
126 MavenSession session,
127 BuildContext buildContext,
128 MavenProject project,
129 ArtifactHandlerManager artifactHandlerManager,
130 RepositorySystem repositorySystem) {
131 super(session, buildContext, project);
132 this.artifactHandlerManager = artifactHandlerManager;
133 this.repositorySystem = repositorySystem;
134 }
135
136 abstract ArtifactItemFilter getMarkedArtifactFilter(ArtifactItem item);
137
138
139
140
141
142
143 protected void verifyRequirements() throws MojoFailureException {
144 if (artifactItems == null || artifactItems.isEmpty()) {
145 throw new MojoFailureException("Either artifact or artifactItems is required ");
146 }
147 }
148
149
150
151
152
153
154
155
156
157
158 protected List<ArtifactItem> getProcessedArtifactItems(ProcessArtifactItemsRequest processArtifactItemsRequest)
159 throws MojoExecutionException {
160
161 boolean removeVersion = processArtifactItemsRequest.isRemoveVersion();
162 boolean prependGroupId = processArtifactItemsRequest.isPrependGroupId();
163 boolean useBaseVersion = processArtifactItemsRequest.isUseBaseVersion();
164
165 boolean removeClassifier = processArtifactItemsRequest.isRemoveClassifier();
166
167 if (artifactItems == null || artifactItems.isEmpty()) {
168 throw new MojoExecutionException("There are no artifactItems configured.");
169 }
170
171 for (ArtifactItem artifactItem : artifactItems) {
172 this.getLog().debug("Configured Artifact: " + artifactItem.toString());
173
174 if (artifactItem.getOutputDirectory() == null) {
175 artifactItem.setOutputDirectory(this.outputDirectory);
176 }
177 artifactItem.getOutputDirectory().mkdirs();
178
179
180 if (artifactItem.getVersion() == null || artifactItem.getVersion().isEmpty()) {
181 fillMissingArtifactVersion(artifactItem);
182 }
183
184 artifactItem.setArtifact(this.getArtifact(artifactItem));
185
186 if (artifactItem.getDestFileName() == null
187 || artifactItem.getDestFileName().isEmpty()) {
188 artifactItem.setDestFileName(DependencyUtil.getFormattedFileName(
189 artifactItem.getArtifact(), removeVersion, prependGroupId, useBaseVersion, removeClassifier));
190 }
191
192 try {
193 artifactItem.setNeedsProcessing(checkIfProcessingNeeded(artifactItem));
194 } catch (ArtifactFilterException e) {
195 throw new MojoExecutionException(e.getMessage(), e);
196 }
197 }
198 return artifactItems;
199 }
200
201 private boolean checkIfProcessingNeeded(ArtifactItem item) throws ArtifactFilterException {
202 return "true".equalsIgnoreCase(item.getOverWrite())
203 || getMarkedArtifactFilter(item).isArtifactIncluded(item);
204 }
205
206 private RepositorySystemSession createSystemSessionForLocalRepo() {
207 RepositorySystemSession repositorySystemSession = session.getRepositorySession();
208 if (localRepositoryDirectory != null) {
209
210 DefaultRepositorySystemSession newSession =
211 new DefaultRepositorySystemSession(session.getRepositorySession());
212
213 newSession.setCache(new DefaultRepositoryCache());
214 LocalRepositoryManager localRepositoryManager = repositorySystem.newLocalRepositoryManager(
215 newSession, new LocalRepository(localRepositoryDirectory));
216
217 newSession.setLocalRepositoryManager(localRepositoryManager);
218 repositorySystemSession = newSession;
219 getLog().debug("localRepoPath: "
220 + localRepositoryManager.getRepository().getBasedir());
221 }
222
223 return repositorySystemSession;
224 }
225
226
227
228
229
230
231
232
233
234 protected Artifact getArtifact(ArtifactItem artifactItem) throws MojoExecutionException {
235
236 try {
237 final String extension;
238
239 ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler(artifactItem.getType());
240 if (artifactHandler != null) {
241 extension = artifactHandler.getExtension();
242 } else {
243 extension = artifactItem.getType();
244 }
245
246 DefaultArtifact artifact = new DefaultArtifact(
247 artifactItem.getGroupId(),
248 artifactItem.getArtifactId(),
249 artifactItem.getClassifier(),
250 extension,
251 artifactItem.getVersion());
252
253 RepositorySystemSession repositorySession = createSystemSessionForLocalRepo();
254
255 ArtifactRequest request = new ArtifactRequest(artifact, getProject().getRemoteProjectRepositories(), null);
256 ArtifactResult artifactResult = repositorySystem.resolveArtifact(repositorySession, request);
257 return RepositoryUtils.toArtifact(artifactResult.getArtifact());
258
259 } catch (ArtifactResolutionException e) {
260 throw new MojoExecutionException("Unable to find/resolve artifact.", e);
261 }
262 }
263
264
265
266
267
268
269
270
271
272 private void fillMissingArtifactVersion(ArtifactItem artifact) throws MojoExecutionException {
273 MavenProject project = getProject();
274 List<Dependency> deps = project.getDependencies();
275 List<Dependency> depMngt = project.getDependencyManagement() == null
276 ? Collections.emptyList()
277 : project.getDependencyManagement().getDependencies();
278
279 if (!findDependencyVersion(artifact, deps, false)
280 && (project.getDependencyManagement() == null || !findDependencyVersion(artifact, depMngt, false))
281 && !findDependencyVersion(artifact, deps, true)
282 && (project.getDependencyManagement() == null || !findDependencyVersion(artifact, depMngt, true))) {
283 throw new MojoExecutionException("Unable to find artifact version of " + artifact.getGroupId() + ":"
284 + artifact.getArtifactId() + " in either dependency list or in project's dependency management.");
285 }
286 }
287
288
289
290
291
292
293
294
295
296
297 private boolean findDependencyVersion(ArtifactItem artifact, List<Dependency> dependencies, boolean looseMatch) {
298 for (Dependency dependency : dependencies) {
299 if (Objects.equals(dependency.getArtifactId(), artifact.getArtifactId())
300 && Objects.equals(dependency.getGroupId(), artifact.getGroupId())
301 && (looseMatch || Objects.equals(dependency.getClassifier(), artifact.getClassifier()))
302 && (looseMatch || Objects.equals(dependency.getType(), artifact.getType()))) {
303 artifact.setVersion(dependency.getVersion());
304
305 return true;
306 }
307 }
308
309 return false;
310 }
311
312
313
314
315 public List<ArtifactItem> getArtifactItems() {
316 return this.artifactItems;
317 }
318
319
320
321
322 public void setArtifactItems(List<ArtifactItem> theArtifactItems) {
323 this.artifactItems = theArtifactItems;
324 }
325
326
327
328
329 public File getOutputDirectory() {
330 return this.outputDirectory;
331 }
332
333
334
335
336 public void setOutputDirectory(File theOutputDirectory) {
337 this.outputDirectory = theOutputDirectory;
338 }
339
340
341
342
343 public boolean isOverWriteIfNewer() {
344 return this.overWriteIfNewer;
345 }
346
347
348
349
350 public void setOverWriteIfNewer(boolean theOverWriteIfNewer) {
351 this.overWriteIfNewer = theOverWriteIfNewer;
352 }
353
354
355
356
357 public boolean isOverWriteReleases() {
358 return this.overWriteReleases;
359 }
360
361
362
363
364 public void setOverWriteReleases(boolean theOverWriteReleases) {
365 this.overWriteReleases = theOverWriteReleases;
366 }
367
368
369
370
371 public boolean isOverWriteSnapshots() {
372 return this.overWriteSnapshots;
373 }
374
375
376
377
378 public void setOverWriteSnapshots(boolean theOverWriteSnapshots) {
379 this.overWriteSnapshots = theOverWriteSnapshots;
380 }
381
382
383
384
385 public void setLocalRepositoryDirectory(File localRepositoryDirectory) {
386 this.localRepositoryDirectory = localRepositoryDirectory;
387 }
388
389
390
391
392
393 public void setArtifact(String artifact) throws MojoFailureException {
394 if (artifact != null) {
395 String packaging = "jar";
396 String classifier;
397 String[] tokens = StringUtils.split(artifact, ":");
398 if (tokens.length < 3 || tokens.length > 5) {
399 throw new MojoFailureException("Invalid artifact, "
400 + "you must specify groupId:artifactId:version[:packaging[:classifier]] " + artifact);
401 }
402 String groupId = tokens[0];
403 String artifactId = tokens[1];
404 String version = tokens[2];
405 if (tokens.length >= 4) {
406 packaging = tokens[3];
407 }
408 if (tokens.length == 5) {
409 classifier = tokens[4];
410 } else {
411 classifier = null;
412 }
413
414 ArtifactItem artifactItem = new ArtifactItem();
415 artifactItem.setGroupId(groupId);
416 artifactItem.setArtifactId(artifactId);
417 artifactItem.setVersion(version);
418 artifactItem.setType(packaging);
419 artifactItem.setClassifier(classifier);
420
421 setArtifactItems(Collections.singletonList(artifactItem));
422 }
423 }
424 }