1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.archetype.mojos;
20
21 import javax.inject.Inject;
22
23 import java.io.File;
24 import java.util.Arrays;
25 import java.util.Properties;
26
27 import org.apache.commons.lang3.StringUtils;
28 import org.apache.maven.archetype.ArchetypeGenerationRequest;
29 import org.apache.maven.archetype.ArchetypeGenerationResult;
30 import org.apache.maven.archetype.ArchetypeManager;
31 import org.apache.maven.archetype.ui.generation.ArchetypeGenerationConfigurator;
32 import org.apache.maven.archetype.ui.generation.ArchetypeSelector;
33 import org.apache.maven.execution.MavenSession;
34 import org.apache.maven.plugin.AbstractMojo;
35 import org.apache.maven.plugin.ContextEnabled;
36 import org.apache.maven.plugin.MojoExecutionException;
37 import org.apache.maven.plugins.annotations.Execute;
38 import org.apache.maven.plugins.annotations.LifecyclePhase;
39 import org.apache.maven.plugins.annotations.Mojo;
40 import org.apache.maven.plugins.annotations.Parameter;
41 import org.apache.maven.project.MavenProject;
42 import org.apache.maven.shared.invoker.DefaultInvocationRequest;
43 import org.apache.maven.shared.invoker.InvocationRequest;
44 import org.apache.maven.shared.invoker.InvocationResult;
45 import org.apache.maven.shared.invoker.Invoker;
46 import org.apache.maven.shared.invoker.MavenInvocationException;
47 import org.eclipse.aether.RepositorySystem;
48
49
50
51
52
53
54
55
56 @Mojo(name = "generate", requiresProject = false)
57 @Execute(phase = LifecyclePhase.GENERATE_SOURCES)
58 public class CreateProjectFromArchetypeMojo extends AbstractMojo implements ContextEnabled {
59 private ArchetypeManager manager;
60
61 private ArchetypeSelector selector;
62
63 private ArchetypeGenerationConfigurator configurator;
64
65 private Invoker invoker;
66
67 private RepositorySystem repositorySystem;
68
69 @Inject
70 public CreateProjectFromArchetypeMojo(
71 ArchetypeManager manager,
72 ArchetypeSelector selector,
73 ArchetypeGenerationConfigurator configurator,
74 Invoker invoker,
75 RepositorySystem repositorySystem) {
76 this.manager = manager;
77 this.selector = selector;
78 this.configurator = configurator;
79 this.invoker = invoker;
80 this.repositorySystem = repositorySystem;
81 }
82
83
84
85
86 @Parameter(property = "archetypeArtifactId")
87 private String archetypeArtifactId;
88
89
90
91
92 @Parameter(property = "archetypeGroupId")
93 private String archetypeGroupId;
94
95
96
97
98 @Parameter(property = "archetypeVersion")
99 private String archetypeVersion;
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 @Parameter(property = "archetypeCatalog", defaultValue = "remote,local")
136 private String archetypeCatalog;
137
138
139
140
141
142 @Parameter(property = "askForDefaultPropertyValues", defaultValue = "false", required = true)
143 private Boolean askForDefaultPropertyValues;
144
145
146
147
148 @Parameter(property = "interactiveMode", defaultValue = "${settings.interactiveMode}", required = true)
149 private Boolean interactiveMode;
150
151 @Parameter(defaultValue = "${basedir}", property = "outputDirectory")
152 private File outputDirectory;
153
154 @Parameter(defaultValue = "${session}", readonly = true, required = true)
155 private MavenSession session;
156
157 @Parameter(defaultValue = "${project}", readonly = true, required = true)
158 private MavenProject project;
159
160
161
162
163 @Parameter(property = "goals")
164 private String goals;
165
166
167
168
169
170
171
172
173
174
175
176 @Parameter(property = "filter")
177 private String filter;
178
179 @Override
180 public void execute() throws MojoExecutionException {
181 Properties executionProperties = session.getUserProperties();
182
183 ArchetypeGenerationRequest request = new ArchetypeGenerationRequest()
184 .setArchetypeGroupId(archetypeGroupId)
185 .setArchetypeArtifactId(archetypeArtifactId)
186 .setArchetypeVersion(archetypeVersion)
187 .setOutputDirectory(outputDirectory.getAbsolutePath())
188 .setRemoteRepositories(project.getRemoteProjectRepositories())
189 .setRemoteArtifactRepositories(project.getRemoteArtifactRepositories())
190 .setMavenSession(session)
191 .setRepositorySession(session.getRepositorySession())
192 .setRepositorySystem(repositorySystem)
193 .setProjectBuildingRequest(session.getProjectBuildingRequest())
194 .setLocalRepository(session.getLocalRepository())
195 .setOffline(session.isOffline())
196 .setFilter(filter)
197 .setAskForDefaultPropertyValues(askForDefaultPropertyValues);
198
199 try {
200 if (interactiveMode.booleanValue()) {
201 getLog().info("Generating project in Interactive mode");
202 } else {
203 getLog().info("Generating project in Batch mode");
204 }
205
206 selector.selectArchetype(request, interactiveMode, archetypeCatalog);
207
208 if (StringUtils.isBlank(request.getArchetypeArtifactId())) {
209
210 return;
211 }
212
213 configurator.configureArchetype(request, interactiveMode, executionProperties);
214
215 ArchetypeGenerationResult generationResult = manager.generateProjectFromArchetype(request);
216
217 if (generationResult.getCause() != null) {
218 throw new MojoExecutionException(generationResult.getCause().getMessage(), generationResult.getCause());
219 }
220 } catch (Exception ex) {
221 throw new MojoExecutionException(ex.getMessage(), ex);
222 }
223
224 String artifactId = request.getArtifactId();
225
226 String postArchetypeGenerationGoals = request.getArchetypeGoals();
227
228 if (postArchetypeGenerationGoals == null || postArchetypeGenerationGoals.isEmpty()) {
229 postArchetypeGenerationGoals = goals;
230 }
231
232 if (postArchetypeGenerationGoals != null && !postArchetypeGenerationGoals.isEmpty()) {
233 invokePostArchetypeGenerationGoals(postArchetypeGenerationGoals, artifactId);
234 }
235 }
236
237 private void invokePostArchetypeGenerationGoals(String goals, String artifactId) throws MojoExecutionException {
238 getLog().info("Invoking post-archetype-generation goals: " + goals);
239
240 File projectBasedir = new File(outputDirectory, artifactId);
241
242 if (projectBasedir.exists()) {
243 InvocationRequest request = new DefaultInvocationRequest()
244 .setBaseDirectory(projectBasedir)
245 .setGoals(Arrays.asList(StringUtils.split(goals, ",")));
246
247 try {
248 InvocationResult result = invoker.execute(request);
249
250 if (result.getExitCode() != 0) {
251 throw new MojoExecutionException("Failed to invoke goals", result.getExecutionException());
252 }
253 } catch (MavenInvocationException e) {
254 throw new MojoExecutionException("Cannot run additions goals.", e);
255 }
256 } else {
257 getLog().info("Post-archetype-generation goals aborted: unavailable basedir " + projectBasedir);
258 }
259 }
260 }