1 package org.apache.maven.plugin.source;
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.model.Resource;
23 import org.apache.maven.plugin.AbstractMojo;
24 import org.apache.maven.plugin.MojoExecutionException;
25 import org.apache.maven.project.MavenProject;
26 import org.apache.maven.project.MavenProjectHelper;
27 import org.codehaus.plexus.archiver.Archiver;
28 import org.codehaus.plexus.archiver.ArchiverException;
29 import org.codehaus.plexus.archiver.jar.JarArchiver;
30 import org.codehaus.plexus.util.FileUtils;
31
32 import java.io.File;
33 import java.io.IOException;
34 import java.util.Iterator;
35 import java.util.List;
36
37 public abstract class AbstractJarSourceMojo
38 extends AbstractMojo
39 {
40 private static final String[] DEFAULT_INCLUDES = new String[]{"**/*",};
41
42 /**
43 * @parameter expression="${project}"
44 * @readonly
45 * @required
46 */
47 private MavenProject project;
48
49 /**
50 * @parameter expression="${project.packaging}"
51 * @readonly
52 * @required
53 */
54 protected String packaging;
55
56 /**
57 * The project where the plugin is currently being executed.
58 * The default value is populated from maven.
59 *
60 * @parameter expression="${executedProject}"
61 * @required
62 */
63 private MavenProject executedProject;
64
65 /**
66 * Specifies whether or not to attach the artifact to the project
67 *
68 * @parameter expression="${attach}" default-value="true"
69 */
70 private boolean attach = true;
71
72 /** @component */
73 private MavenProjectHelper projectHelper;
74
75 /**
76 * The directory where the generated archive file will be put.
77 * Defaults to ${project.build.directory} specified in the pom or
78 * inherited from the super pom.
79 *
80 * @parameter expression="${project.build.directory}"
81 * @required
82 */
83 protected File outputDirectory;
84
85 /**
86 * The filename to be used for the generated archive file.
87 * For the source:jar goal, "-sources" is appended to this filename.
88 * For the source:test-jar goal, "-test-sources" is appended.
89 * Defaults to ${project.build.finalName} specified in the pom
90 * or inherited from the super pom.
91 *
92 * @parameter expression="${project.build.finalName}"
93 * @required
94 */
95 protected String finalName;
96
97 /** @see org.apache.maven.plugin.AbstractMojo#execute() */
98 public abstract void execute()
99 throws MojoExecutionException;
100
101 public MavenProject getProject()
102 {
103 return project;
104 }
105
106 public void setProject( MavenProject project )
107 {
108 this.project = project;
109 }
110
111 public String getPackaging()
112 {
113 return packaging;
114 }
115
116 public void setPackaging( String packaging )
117 {
118 this.packaging = packaging;
119 }
120
121 public MavenProject getExecutedProject()
122 {
123 return executedProject;
124 }
125
126 public void setExecutedProject( MavenProject executedProject )
127 {
128 this.executedProject = executedProject;
129 }
130
131 /**
132 * Add the compile source directories and resource directories that will be included in the jar file
133 *
134 * @param compileSourceRoots
135 * @param resources
136 * @param sourceDirectories
137 * @return an array of File objects that contains the directories that will be included in the jar file
138 */
139 protected File[] addDirectories( List compileSourceRoots,
140 List resources,
141 File[] sourceDirectories )
142 {
143 int count = 0;
144 for ( Iterator i = compileSourceRoots.iterator(); i.hasNext(); )
145 {
146 sourceDirectories[count] = new File( (String) i.next() );
147 count++;
148 }
149
150 for ( Iterator i = resources.iterator(); i.hasNext(); )
151 {
152 Resource resource = (Resource) i.next();
153 sourceDirectories[count] = new File( resource.getDirectory() );
154 count++;
155 }
156
157 return sourceDirectories;
158 }
159
160 /**
161 * Get the test sources that will be included in the test sources jar file
162 *
163 * @return an array of File objects that contains the test source directories
164 */
165 protected File[] getTestSources()
166 {
167 List testCompileSourceRoots = executedProject.getTestCompileSourceRoots();
168 List testResources = executedProject.getTestResources();
169
170 File[] testSourceDirectories = new File[testCompileSourceRoots.size() + testResources.size()];
171 testSourceDirectories = addDirectories( testCompileSourceRoots, testResources, testSourceDirectories );
172
173 return testSourceDirectories;
174 }
175
176 /**
177 * Get the main sources that will be included in the jar file
178 *
179 * @return an array of File objects that contains the source directories
180 */
181 protected File[] getDefaultSources()
182 {
183 List compileSourceRoots = executedProject.getCompileSourceRoots();
184 List resources = executedProject.getResources();
185
186 File[] sourceDirectories = new File[compileSourceRoots.size() + resources.size()];
187 sourceDirectories = addDirectories( compileSourceRoots, resources, sourceDirectories );
188
189 return sourceDirectories;
190 }
191
192 /**
193 * Create jar file that contains the specified source directories
194 *
195 * @param outputFile the file name of the jar
196 * @param sourceDirectories the source directories that will be included in the jar file
197 */
198 protected void createJar( File outputFile,
199 File[] sourceDirectories,
200 Archiver archiver )
201 throws IOException, ArchiverException
202 {
203 makeSourceBundle( outputFile, sourceDirectories, archiver );
204 }
205
206 /**
207 * Method to attach generated artifact to artifact list
208 *
209 * @param outputFile the artifact file to be attached
210 * @param classifier
211 */
212 protected void attachArtifact( File outputFile,
213 String classifier )
214 {
215 if ( !attach )
216 {
217 getLog().info( "NOT adding java-sources to attached artifacts list." );
218 }
219 else
220 {
221
222
223 projectHelper.attachArtifact( project, "java-source", classifier, outputFile );
224 }
225 }
226
227 /**
228 * Method to create an archive of the specified files
229 *
230 * @param outputFile the destination file of the generated archive
231 * @param sourceDirectories the directory where the files to be archived are located
232 * @param archiver the archiver object that will create the archive
233 * @throws ArchiverException
234 * @throws IOException
235 */
236 protected void makeSourceBundle( File outputFile,
237 File[] sourceDirectories,
238 Archiver archiver )
239 throws ArchiverException, IOException
240 {
241 String[] includes = DEFAULT_INCLUDES;
242
243 for ( int i = 0; i < sourceDirectories.length; i++ )
244 {
245 if ( sourceDirectories[i].exists() )
246 {
247 archiver.addDirectory( sourceDirectories[i], includes, FileUtils.getDefaultExcludes() );
248 }
249 }
250
251 archiver.setDestFile( outputFile );
252
253 archiver.createArchive();
254 }
255
256 protected Archiver createArchiver()
257 throws ArchiverException
258 {
259 Archiver archiver = new JarArchiver();
260
261 if ( project.getBuild() != null )
262 {
263 List resources = project.getBuild().getResources();
264
265 for ( Iterator i = resources.iterator(); i.hasNext(); )
266 {
267 Resource r = (Resource) i.next();
268
269 if ( r.getDirectory().endsWith( "maven-shared-archive-resources" ) )
270 {
271 archiver.addDirectory( new File( r.getDirectory() ) );
272 }
273 }
274
275
276 }
277
278 return archiver;
279 }
280 }