1 package org.apache.maven.plugin.archetype;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import org.apache.maven.archetype.Archetype;
20 import org.apache.maven.archetype.ArchetypeDescriptorException;
21 import org.apache.maven.archetype.ArchetypeNotFoundException;
22 import org.apache.maven.archetype.ArchetypeTemplateProcessingException;
23 import org.apache.maven.artifact.repository.ArtifactRepository;
24 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
25 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
26 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
27 import org.apache.maven.plugin.AbstractMojo;
28 import org.apache.maven.plugin.MojoExecutionException;
29 import org.apache.maven.project.MavenProject;
30 import org.codehaus.plexus.util.StringUtils;
31
32 import java.util.ArrayList;
33 import java.util.HashMap;
34 import java.util.List;
35 import java.util.Map;
36
37 /**
38 * The archetype creation goal looks for an archetype with a given groupId,
39 * artifactId, and version and retrieves it from the remote repository. Once the
40 * archetype is retrieved, it is then processed against a set of user parameters
41 * to create a working Maven project.
42 *
43 * @description Creates archetype containers.
44 * @requiresProject false
45 * @goal create
46 */
47 public class MavenArchetypeMojo
48 extends AbstractMojo
49 {
50 /**
51 * Used to create the Archetype specified by the groupId, artifactId, and
52 * version from the remote repository.
53 *
54 * @component
55 */
56 private Archetype archetype;
57
58 /**
59 * Used to create ArtifactRepository objects given the urls of the remote
60 * repositories.
61 *
62 * @component
63 */
64 private ArtifactRepositoryFactory artifactRepositoryFactory;
65
66 /**
67 * Determines whether the layout is legacy or not.
68 *
69 * @component role="org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout" roleHint="default"
70 */
71 private ArtifactRepositoryLayout defaultArtifactRepositoryLayout;
72
73
74 /**
75 * Maven's local repository.
76 *
77 * @parameter expression="${localRepository}"
78 * @required
79 */
80 private ArtifactRepository localRepository;
81
82 /**
83 * The Archetype Group Id to be used.
84 *
85 * @parameter expression="${archetypeGroupId}" default-value="org.apache.maven.archetypes"
86 * @required
87 */
88 private String archetypeGroupId;
89
90 /**
91 * The Archetype Artifact Id to be used.
92 *
93 * @parameter expression="${archetypeArtifactId}" default-value="maven-archetype-quickstart"
94 * @required
95 */
96 private String archetypeArtifactId;
97
98 /**
99 * The Archetype Version to be used.
100 *
101 * @parameter expression="${archetypeVersion}" default-value="RELEASE"
102 * @required
103 */
104 private String archetypeVersion;
105
106 /**
107 * The Group Id of the project to be build.
108 *
109 * @parameter expression="${groupId}"
110 */
111 private String groupId;
112
113 /**
114 * The Artifact Id of the project to be build.
115 *
116 * @parameter expression="${artifactId}"
117 */
118 private String artifactId;
119
120 /**
121 * The Version of the project to be build.
122 *
123 * @parameter expression="${version}" default-value="1.0-SNAPSHOT"
124 * @required
125 */
126 private String version;
127
128 /**
129 * The Package Name of the project to be build.
130 *
131 * @parameter expression="${packageName}" alias="package"
132 */
133 private String packageName;
134
135 /**
136 * The remote repositories available for discovering dependencies and extensions as indicated
137 * by the POM.
138 *
139 * @parameter expression="${project.remoteArtifactRepositories}"
140 * @required
141 */
142 private List pomRemoteRepositories;
143
144 /**
145 * Other remote repositories available for discovering dependencies and extensions.
146 *
147 * @parameter expression="${remoteRepositories}"
148 */
149 private String remoteRepositories;
150
151 /**
152 * The project to be created an archetype of.
153 *
154 * @parameter expression="${project}"
155 */
156 private MavenProject project;
157
158 /**
159 * @parameter expression="${basedir}" default-value="${user.dir}"
160 */
161 private String basedir;
162
163 public void execute()
164 throws MojoExecutionException
165 {
166
167
168
169
170
171
172
173
174
175
176
177
178
179 if ( project.getFile() != null && groupId == null )
180 {
181 groupId = project.getGroupId();
182 }
183
184 if ( packageName == null )
185 {
186 getLog().info( "Defaulting package to group ID: " + groupId );
187
188 packageName = groupId;
189 }
190
191
192 Map map = new HashMap();
193
194 map.put( "basedir", basedir );
195
196 map.put( "package", packageName );
197
198 map.put( "packageName", packageName );
199
200 map.put( "groupId", groupId );
201
202 map.put( "artifactId", artifactId );
203
204 map.put( "version", version );
205
206 List archetypeRemoteRepositories = new ArrayList( pomRemoteRepositories );
207
208 if ( remoteRepositories != null )
209 {
210 getLog().info( "We are using command line specified remote repositories: " + remoteRepositories );
211
212 archetypeRemoteRepositories = new ArrayList();
213
214 String[] s = StringUtils.split( remoteRepositories, "," );
215
216 for ( int i = 0; i < s.length; i++ )
217 {
218 archetypeRemoteRepositories.add( createRepository( s[i], "id" + i ) );
219 }
220 }
221
222 try
223 {
224 archetype.createArchetype( archetypeGroupId, archetypeArtifactId, archetypeVersion, localRepository,
225 archetypeRemoteRepositories, map );
226 }
227 catch ( ArchetypeNotFoundException e )
228 {
229 throw new MojoExecutionException( "Error creating from archetype", e );
230 }
231 catch ( ArchetypeDescriptorException e )
232 {
233 throw new MojoExecutionException( "Error creating from archetype", e );
234 }
235 catch ( ArchetypeTemplateProcessingException e )
236 {
237 throw new MojoExecutionException( "Error creating from archetype", e );
238 }
239 }
240
241
242
243 public ArtifactRepository createRepository( String url, String repositoryId )
244 {
245
246
247
248
249
250 String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS;
251
252 String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
253
254 ArtifactRepositoryPolicy snapshotsPolicy =
255 new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag );
256
257 ArtifactRepositoryPolicy releasesPolicy =
258 new ArtifactRepositoryPolicy( true, updatePolicyFlag, checksumPolicyFlag );
259
260 return artifactRepositoryFactory.createArtifactRepository( repositoryId, url, defaultArtifactRepositoryLayout,
261 snapshotsPolicy, releasesPolicy );
262 }
263 }
264