1 package org.apache.maven.plugins.jar;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.archiver.MavenArchiveConfiguration;
23 import org.apache.maven.archiver.MavenArchiver;
24 import org.apache.maven.execution.MavenSession;
25 import org.apache.maven.plugin.AbstractMojo;
26 import org.apache.maven.plugin.MojoExecutionException;
27 import org.apache.maven.plugins.annotations.Component;
28 import org.apache.maven.plugins.annotations.Parameter;
29 import org.apache.maven.project.MavenProject;
30 import org.apache.maven.project.MavenProjectHelper;
31 import org.apache.maven.shared.model.fileset.FileSet;
32 import org.apache.maven.shared.model.fileset.util.FileSetManager;
33 import org.codehaus.plexus.archiver.Archiver;
34 import org.codehaus.plexus.archiver.jar.JarArchiver;
35
36 import java.io.File;
37 import java.util.Arrays;
38 import java.util.Map;
39
40
41
42
43
44
45
46 public abstract class AbstractJarMojo
47 extends AbstractMojo
48 {
49
50 private static final String[] DEFAULT_EXCLUDES = new String[] { "**/package.html" };
51
52 private static final String[] DEFAULT_INCLUDES = new String[] { "**/**" };
53
54 private static final String MODULE_DESCRIPTOR_FILE_NAME = "module-info.class";
55
56
57
58
59
60 @Parameter
61 private String[] includes;
62
63
64
65
66
67 @Parameter
68 private String[] excludes;
69
70
71
72
73 @Parameter( defaultValue = "${project.build.directory}", required = true )
74 private File outputDirectory;
75
76
77
78
79 @Parameter( defaultValue = "${project.build.finalName}", readonly = true )
80 private String finalName;
81
82
83
84
85 @Component
86 private Map<String, Archiver> archivers;
87
88
89
90
91 @Parameter( defaultValue = "${project}", readonly = true, required = true )
92 private MavenProject project;
93
94
95
96
97 @Parameter( defaultValue = "${session}", readonly = true, required = true )
98 private MavenSession session;
99
100
101
102
103
104 @Parameter
105 private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
106
107
108
109
110
111
112
113
114 @Parameter( property = "jar.useDefaultManifestFile", defaultValue = "false" )
115 private boolean useDefaultManifestFile;
116
117
118
119
120 @Component
121 private MavenProjectHelper projectHelper;
122
123
124
125
126
127
128
129
130
131
132
133
134 @Parameter( property = "maven.jar.forceCreation", defaultValue = "false" )
135 private boolean forceCreation;
136
137
138
139
140 @Parameter( defaultValue = "false" )
141 private boolean skipIfEmpty;
142
143
144
145
146
147 protected abstract File getClassesDirectory();
148
149
150
151
152 protected final MavenProject getProject()
153 {
154 return project;
155 }
156
157
158
159
160
161 protected abstract String getClassifier();
162
163
164
165
166
167 protected abstract String getType();
168
169
170
171
172
173
174
175
176
177 protected File getJarFile( File basedir, String resultFinalName, String classifier )
178 {
179 if ( basedir == null )
180 {
181 throw new IllegalArgumentException( "basedir is not allowed to be null" );
182 }
183 if ( resultFinalName == null )
184 {
185 throw new IllegalArgumentException( "finalName is not allowed to be null" );
186 }
187
188 StringBuilder fileName = new StringBuilder( resultFinalName );
189
190 if ( hasClassifier() )
191 {
192 fileName.append( "-" ).append( classifier );
193 }
194
195 fileName.append( ".jar" );
196
197 return new File( basedir, fileName.toString() );
198 }
199
200
201
202
203
204
205 public File createArchive()
206 throws MojoExecutionException
207 {
208 File jarFile = getJarFile( outputDirectory, finalName, getClassifier() );
209
210 FileSetManager fileSetManager = new FileSetManager();
211 FileSet jarContentFileSet = new FileSet();
212 jarContentFileSet.setDirectory( getClassesDirectory().getAbsolutePath() );
213 jarContentFileSet.setIncludes( Arrays.asList( getIncludes() ) );
214 jarContentFileSet.setExcludes( Arrays.asList( getExcludes() ) );
215
216 boolean containsModuleDescriptor = false;
217 String[] includedFiles = fileSetManager.getIncludedFiles( jarContentFileSet );
218 for ( String includedFile : includedFiles )
219 {
220
221
222
223
224
225
226
227
228 if ( includedFile.endsWith( MODULE_DESCRIPTOR_FILE_NAME ) )
229 {
230 containsModuleDescriptor = true;
231 break;
232 }
233 }
234
235 MavenArchiver archiver = new MavenArchiver();
236
237 if ( containsModuleDescriptor )
238 {
239 archiver.setArchiver( (JarArchiver) archivers.get( "mjar" ) );
240 }
241 else
242 {
243 archiver.setArchiver( (JarArchiver) archivers.get( "jar" ) );
244 }
245
246 archiver.setOutputFile( jarFile );
247
248 archive.setForced( forceCreation );
249
250 try
251 {
252 File contentDirectory = getClassesDirectory();
253 if ( !contentDirectory.exists() )
254 {
255 getLog().warn( "JAR will be empty - no content was marked for inclusion!" );
256 }
257 else
258 {
259 archiver.getArchiver().addDirectory( contentDirectory, getIncludes(), getExcludes() );
260 }
261
262 archiver.createArchive( session, project, archive );
263
264 return jarFile;
265 }
266 catch ( Exception e )
267 {
268
269 throw new MojoExecutionException( "Error assembling JAR", e );
270 }
271 }
272
273
274
275
276
277 public void execute()
278 throws MojoExecutionException
279 {
280 if ( useDefaultManifestFile )
281 {
282 throw new MojoExecutionException( "You are using 'useDefaultManifestFile' which has been removed"
283 + " from the maven-jar-plugin. "
284 + "Please see the >>Major Version Upgrade to version 3.0.0<< on the plugin site." );
285 }
286
287 if ( skipIfEmpty && ( !getClassesDirectory().exists() || getClassesDirectory().list().length < 1 ) )
288 {
289 getLog().info( "Skipping packaging of the " + getType() );
290 }
291 else
292 {
293 File jarFile = createArchive();
294
295 if ( hasClassifier() )
296 {
297 projectHelper.attachArtifact( getProject(), getType(), getClassifier(), jarFile );
298 }
299 else
300 {
301 if ( projectHasAlreadySetAnArtifact() )
302 {
303 throw new MojoExecutionException( "You have to use a classifier "
304 + "to attach supplemental artifacts to the project instead of replacing them." );
305 }
306 getProject().getArtifact().setFile( jarFile );
307 }
308 }
309 }
310
311 private boolean projectHasAlreadySetAnArtifact()
312 {
313 if ( getProject().getArtifact().getFile() != null )
314 {
315 return getProject().getArtifact().getFile().isFile();
316 }
317 else
318 {
319 return false;
320 }
321 }
322
323
324
325
326 protected boolean hasClassifier()
327 {
328 boolean result = false;
329 if ( getClassifier() != null && getClassifier().trim().length() > 0 )
330 {
331 result = true;
332 }
333
334 return result;
335 }
336
337 private String[] getIncludes()
338 {
339 if ( includes != null && includes.length > 0 )
340 {
341 return includes;
342 }
343 return DEFAULT_INCLUDES;
344 }
345
346 private String[] getExcludes()
347 {
348 if ( excludes != null && excludes.length > 0 )
349 {
350 return excludes;
351 }
352 return DEFAULT_EXCLUDES;
353 }
354 }