1 package org.apache.maven.plugins.dependency;
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.io.IOException;
24 import java.lang.reflect.Field;
25 import java.util.List;
26
27 import org.apache.maven.artifact.Artifact;
28 import org.apache.maven.artifact.repository.ArtifactRepository;
29 import org.apache.maven.execution.MavenSession;
30 import org.apache.maven.plugin.AbstractMojo;
31 import org.apache.maven.plugin.MojoExecutionException;
32 import org.apache.maven.plugin.MojoFailureException;
33 import org.apache.maven.plugins.annotations.Component;
34 import org.apache.maven.plugins.annotations.Parameter;
35 import org.apache.maven.plugins.dependency.utils.DependencySilentLog;
36 import org.apache.maven.project.DefaultProjectBuildingRequest;
37 import org.apache.maven.project.MavenProject;
38 import org.apache.maven.project.ProjectBuildingRequest;
39 import org.codehaus.plexus.archiver.ArchiverException;
40 import org.codehaus.plexus.archiver.UnArchiver;
41 import org.codehaus.plexus.archiver.manager.ArchiverManager;
42 import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
43 import org.codehaus.plexus.archiver.zip.ZipUnArchiver;
44 import org.codehaus.plexus.components.io.filemappers.FileMapper;
45 import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector;
46 import org.codehaus.plexus.util.FileUtils;
47 import org.codehaus.plexus.util.ReflectionUtils;
48 import org.codehaus.plexus.util.StringUtils;
49
50
51
52
53 public abstract class AbstractDependencyMojo
54 extends AbstractMojo
55 {
56
57
58
59 @Component
60 private ArchiverManager archiverManager;
61
62
63
64
65
66
67
68
69
70 @Parameter( property = "dependency.useJvmChmod", defaultValue = "true" )
71 private boolean useJvmChmod = true;
72
73
74
75
76
77
78 @Parameter( property = "dependency.ignorePermissions", defaultValue = "false" )
79 private boolean ignorePermissions;
80
81
82
83
84 @Parameter( defaultValue = "${project}", readonly = true, required = true )
85 private MavenProject project;
86
87
88
89
90 @Parameter( defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true )
91 private List<ArtifactRepository> remoteRepositories;
92
93
94
95
96 @Parameter( defaultValue = "${reactorProjects}", readonly = true )
97 protected List<MavenProject> reactorProjects;
98
99
100
101
102 @Parameter( defaultValue = "${session}", readonly = true, required = true )
103 protected MavenSession session;
104
105
106
107
108
109
110 @Parameter( property = "silent", defaultValue = "false" )
111 private boolean silent;
112
113
114
115
116
117
118 @Parameter( property = "outputAbsoluteArtifactFilename", defaultValue = "false" )
119 protected boolean outputAbsoluteArtifactFilename;
120
121
122
123
124
125
126 @Parameter( property = "mdep.skip", defaultValue = "false" )
127 private boolean skip;
128
129
130
131
132
133
134 @Override
135 public final void execute()
136 throws MojoExecutionException, MojoFailureException
137 {
138 if ( isSkip() )
139 {
140 getLog().info( "Skipping plugin execution" );
141 return;
142 }
143
144 doExecute();
145 }
146
147
148
149
150
151 protected abstract void doExecute()
152 throws MojoExecutionException, MojoFailureException;
153
154
155
156
157 public ArchiverManager getArchiverManager()
158 {
159 return this.archiverManager;
160 }
161
162
163
164
165
166
167
168
169 protected void copyFile( File artifact, File destFile )
170 throws MojoExecutionException
171 {
172 try
173 {
174 getLog().info( "Copying "
175 + ( this.outputAbsoluteArtifactFilename ? artifact.getAbsolutePath() : artifact.getName() ) + " to "
176 + destFile );
177
178 if ( artifact.isDirectory() )
179 {
180
181 throw new MojoExecutionException( "Artifact has not been packaged yet. When used on reactor artifact, "
182 + "copy should be executed after packaging: see MDEP-187." );
183 }
184
185 FileUtils.copyFile( artifact, destFile );
186 }
187 catch ( IOException e )
188 {
189 throw new MojoExecutionException( "Error copying artifact from " + artifact + " to " + destFile, e );
190 }
191 }
192
193
194
195
196
197
198
199
200
201 protected void unpack( Artifact artifact, File location, String encoding, FileMapper[] fileMappers )
202 throws MojoExecutionException
203 {
204 unpack( artifact, location, null, null, encoding, fileMappers );
205 }
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221 protected void unpack( Artifact artifact, File location, String includes, String excludes, String encoding,
222 FileMapper[] fileMappers ) throws MojoExecutionException
223 {
224 unpack( artifact, artifact.getType(), location, includes, excludes, encoding, fileMappers );
225 }
226
227
228
229
230
231
232
233
234
235
236
237
238 protected void unpack( Artifact artifact, String type, File location, String includes, String excludes,
239 String encoding, FileMapper[] fileMappers )
240 throws MojoExecutionException
241 {
242 File file = artifact.getFile();
243 try
244 {
245 logUnpack( file, location, includes, excludes );
246
247 location.mkdirs();
248 if ( !location.exists() )
249 {
250 throw new MojoExecutionException( "Location to write unpacked files to could not be created: "
251 + location );
252 }
253
254 if ( file.isDirectory() )
255 {
256
257 throw new MojoExecutionException( "Artifact has not been packaged yet. When used on reactor artifact, "
258 + "unpack should be executed after packaging: see MDEP-98." );
259 }
260
261 UnArchiver unArchiver;
262
263 try
264 {
265 unArchiver = archiverManager.getUnArchiver( type );
266 getLog().debug( "Found unArchiver by type: " + unArchiver );
267 }
268 catch ( NoSuchArchiverException e )
269 {
270 unArchiver = archiverManager.getUnArchiver( file );
271 getLog().debug( "Found unArchiver by extension: " + unArchiver );
272 }
273
274 if ( encoding != null && unArchiver instanceof ZipUnArchiver )
275 {
276 ( (ZipUnArchiver) unArchiver ).setEncoding( encoding );
277 getLog().info( "Unpacks '" + type + "' with encoding '" + encoding + "'." );
278 }
279
280 unArchiver.setIgnorePermissions( ignorePermissions );
281
282 unArchiver.setSourceFile( file );
283
284 unArchiver.setDestDirectory( location );
285
286 if ( StringUtils.isNotEmpty( excludes ) || StringUtils.isNotEmpty( includes ) )
287 {
288
289
290
291 IncludeExcludeFileSelector[] selectors =
292 new IncludeExcludeFileSelector[] { new IncludeExcludeFileSelector() };
293
294 if ( StringUtils.isNotEmpty( excludes ) )
295 {
296 selectors[0].setExcludes( excludes.split( "," ) );
297 }
298
299 if ( StringUtils.isNotEmpty( includes ) )
300 {
301 selectors[0].setIncludes( includes.split( "," ) );
302 }
303
304 unArchiver.setFileSelectors( selectors );
305 }
306 if ( this.silent )
307 {
308 silenceUnarchiver( unArchiver );
309 }
310
311 unArchiver.setFileMappers( fileMappers );
312
313 unArchiver.extract();
314 }
315 catch ( NoSuchArchiverException e )
316 {
317 throw new MojoExecutionException( "Unknown archiver type", e );
318 }
319 catch ( ArchiverException e )
320 {
321 throw new MojoExecutionException( "Error unpacking file: " + file + " to: " + location
322 + System.lineSeparator() + e.toString(), e );
323 }
324 }
325
326 private void silenceUnarchiver( UnArchiver unArchiver )
327 {
328
329 try
330 {
331 Field field = ReflectionUtils.getFieldByNameIncludingSuperclasses( "logger", unArchiver.getClass() );
332
333 field.setAccessible( true );
334
335 field.set( unArchiver, this.getLog() );
336 }
337 catch ( Exception e )
338 {
339
340 }
341 }
342
343
344
345
346
347 public ProjectBuildingRequest newResolveArtifactProjectBuildingRequest()
348 {
349 ProjectBuildingRequest buildingRequest =
350 new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
351
352 buildingRequest.setRemoteRepositories( remoteRepositories );
353
354 return buildingRequest;
355 }
356
357
358
359
360 public MavenProject getProject()
361 {
362 return this.project;
363 }
364
365
366
367
368 public void setArchiverManager( ArchiverManager archiverManager )
369 {
370 this.archiverManager = archiverManager;
371 }
372
373
374
375
376 public boolean isUseJvmChmod()
377 {
378 return useJvmChmod;
379 }
380
381
382
383
384 public void setUseJvmChmod( boolean useJvmChmod )
385 {
386 this.useJvmChmod = useJvmChmod;
387 }
388
389
390
391
392 public boolean isSkip()
393 {
394 return skip;
395 }
396
397
398
399
400 public void setSkip( boolean skip )
401 {
402 this.skip = skip;
403 }
404
405
406
407
408 protected final boolean isSilent()
409 {
410 return silent;
411 }
412
413
414
415
416 public void setSilent( boolean silent )
417 {
418 this.silent = silent;
419 if ( silent )
420 {
421 setLog( new DependencySilentLog() );
422 }
423 }
424
425 private void logUnpack( File file, File location, String includes, String excludes )
426 {
427 if ( !getLog().isInfoEnabled() )
428 {
429 return;
430 }
431
432 StringBuilder msg = new StringBuilder();
433 msg.append( "Unpacking " );
434 msg.append( file );
435 msg.append( " to " );
436 msg.append( location );
437
438 if ( includes != null && excludes != null )
439 {
440 msg.append( " with includes \"" );
441 msg.append( includes );
442 msg.append( "\" and excludes \"" );
443 msg.append( excludes );
444 msg.append( "\"" );
445 }
446 else if ( includes != null )
447 {
448 msg.append( " with includes \"" );
449 msg.append( includes );
450 msg.append( "\"" );
451 }
452 else if ( excludes != null )
453 {
454 msg.append( " with excludes \"" );
455 msg.append( excludes );
456 msg.append( "\"" );
457 }
458
459 getLog().info( msg.toString() );
460 }
461 }