1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.cling.invoker.mvn;
20
21 import java.util.Arrays;
22 import java.util.List;
23 import java.util.Optional;
24
25 import org.apache.commons.cli.CommandLine;
26 import org.apache.commons.cli.Option;
27 import org.apache.commons.cli.ParseException;
28 import org.apache.maven.api.cli.mvn.MavenOptions;
29 import org.apache.maven.cling.invoker.CommonsCliOptions;
30
31 public class CommonsCliMavenOptions extends CommonsCliOptions implements MavenOptions {
32 public static CommonsCliMavenOptions parse(String source, String[] args) throws ParseException {
33 CLIManager cliManager = new CLIManager();
34 return new CommonsCliMavenOptions(source, cliManager, cliManager.parse(args));
35 }
36
37 protected CommonsCliMavenOptions(String source, CLIManager cliManager, CommandLine commandLine) {
38 super(source, cliManager, commandLine);
39 }
40
41 @Override
42 public Optional<String> alternatePomFile() {
43 if (commandLine.hasOption(CLIManager.ALTERNATE_POM_FILE)) {
44 return Optional.of(commandLine.getOptionValue(CLIManager.ALTERNATE_POM_FILE));
45 }
46 return Optional.empty();
47 }
48
49 @Override
50 public Optional<Boolean> nonRecursive() {
51 if (commandLine.hasOption(CLIManager.NON_RECURSIVE)) {
52 return Optional.of(Boolean.TRUE);
53 }
54 return Optional.empty();
55 }
56
57 @Override
58 public Optional<Boolean> updateSnapshots() {
59 if (commandLine.hasOption(CLIManager.UPDATE_SNAPSHOTS)) {
60 return Optional.of(Boolean.TRUE);
61 }
62 return Optional.empty();
63 }
64
65 @Override
66 public Optional<List<String>> activatedProfiles() {
67 if (commandLine.hasOption(CLIManager.ACTIVATE_PROFILES)) {
68 return Optional.of(Arrays.asList(commandLine.getOptionValues(CLIManager.ACTIVATE_PROFILES)));
69 }
70 return Optional.empty();
71 }
72
73 @Override
74 public Optional<Boolean> suppressSnapshotUpdates() {
75 if (commandLine.hasOption(CLIManager.SUPPRESS_SNAPSHOT_UPDATES)) {
76 return Optional.of(Boolean.TRUE);
77 }
78 return Optional.empty();
79 }
80
81 @Override
82 public Optional<Boolean> strictChecksums() {
83 if (commandLine.hasOption(CLIManager.CHECKSUM_FAILURE_POLICY)) {
84 return Optional.of(Boolean.TRUE);
85 }
86 return Optional.empty();
87 }
88
89 @Override
90 public Optional<Boolean> relaxedChecksums() {
91 if (commandLine.hasOption(CLIManager.CHECKSUM_WARNING_POLICY)) {
92 return Optional.of(Boolean.TRUE);
93 }
94 return Optional.empty();
95 }
96
97 @Override
98 public Optional<Boolean> failFast() {
99 if (commandLine.hasOption(CLIManager.FAIL_FAST)) {
100 return Optional.of(Boolean.TRUE);
101 }
102 return Optional.empty();
103 }
104
105 @Override
106 public Optional<Boolean> failAtEnd() {
107 if (commandLine.hasOption(CLIManager.FAIL_AT_END)) {
108 return Optional.of(Boolean.TRUE);
109 }
110 return Optional.empty();
111 }
112
113 @Override
114 public Optional<Boolean> failNever() {
115 if (commandLine.hasOption(CLIManager.FAIL_NEVER)) {
116 return Optional.of(Boolean.TRUE);
117 }
118 return Optional.empty();
119 }
120
121 @Override
122 public Optional<Boolean> resume() {
123 if (commandLine.hasOption(CLIManager.RESUME)) {
124 return Optional.of(Boolean.TRUE);
125 }
126 return Optional.empty();
127 }
128
129 @Override
130 public Optional<String> resumeFrom() {
131 if (commandLine.hasOption(CLIManager.RESUME_FROM)) {
132 return Optional.of(commandLine.getOptionValue(CLIManager.RESUME_FROM));
133 }
134 return Optional.empty();
135 }
136
137 @Override
138 public Optional<List<String>> projects() {
139 if (commandLine.hasOption(CLIManager.PROJECT_LIST)) {
140 return Optional.of(Arrays.asList(commandLine.getOptionValues(CLIManager.PROJECT_LIST)));
141 }
142 return Optional.empty();
143 }
144
145 @Override
146 public Optional<Boolean> alsoMake() {
147 if (commandLine.hasOption(CLIManager.ALSO_MAKE)) {
148 return Optional.of(Boolean.TRUE);
149 }
150 return Optional.empty();
151 }
152
153 @Override
154 public Optional<Boolean> alsoMakeDependents() {
155 if (commandLine.hasOption(CLIManager.ALSO_MAKE_DEPENDENTS)) {
156 return Optional.of(Boolean.TRUE);
157 }
158 return Optional.empty();
159 }
160
161 @Override
162 public Optional<String> threads() {
163 if (commandLine.hasOption(CLIManager.THREADS)) {
164 return Optional.of(commandLine.getOptionValue(CLIManager.THREADS));
165 }
166 return Optional.empty();
167 }
168
169 @Override
170 public Optional<String> builder() {
171 if (commandLine.hasOption(CLIManager.BUILDER)) {
172 return Optional.of(commandLine.getOptionValue(CLIManager.BUILDER));
173 }
174 return Optional.empty();
175 }
176
177 @Override
178 public Optional<Boolean> noTransferProgress() {
179 if (commandLine.hasOption(CLIManager.NO_TRANSFER_PROGRESS)) {
180 return Optional.of(Boolean.TRUE);
181 }
182 return Optional.empty();
183 }
184
185 @Override
186 public Optional<Boolean> cacheArtifactNotFound() {
187 if (commandLine.hasOption(CLIManager.CACHE_ARTIFACT_NOT_FOUND)) {
188 return Optional.of(Boolean.parseBoolean(commandLine.getOptionValue(CLIManager.CACHE_ARTIFACT_NOT_FOUND)));
189 }
190 return Optional.empty();
191 }
192
193 @Override
194 public Optional<Boolean> strictArtifactDescriptorPolicy() {
195 if (commandLine.hasOption(CLIManager.STRICT_ARTIFACT_DESCRIPTOR_POLICY)) {
196 return Optional.of(
197 Boolean.parseBoolean(commandLine.getOptionValue(CLIManager.STRICT_ARTIFACT_DESCRIPTOR_POLICY)));
198 }
199 return Optional.empty();
200 }
201
202 @Override
203 public Optional<Boolean> ignoreTransitiveRepositories() {
204 if (commandLine.hasOption(CLIManager.IGNORE_TRANSITIVE_REPOSITORIES)) {
205 return Optional.of(Boolean.TRUE);
206 }
207 return Optional.empty();
208 }
209
210 @Override
211 public Optional<String> atFile() {
212 if (commandLine.hasOption(CLIManager.AT_FILE)) {
213 return Optional.of(commandLine.getOptionValue(CLIManager.AT_FILE));
214 }
215 return Optional.empty();
216 }
217
218 @Override
219 public Optional<List<String>> goals() {
220 if (!commandLine.getArgList().isEmpty()) {
221 return Optional.of(commandLine.getArgList());
222 }
223 return Optional.empty();
224 }
225
226 @Override
227 protected CommonsCliMavenOptions copy(
228 String source, CommonsCliOptions.CLIManager cliManager, CommandLine commandLine) {
229 return new CommonsCliMavenOptions(source, (CLIManager) cliManager, commandLine);
230 }
231
232 protected static class CLIManager extends CommonsCliOptions.CLIManager {
233 public static final String ALTERNATE_POM_FILE = "f";
234 public static final String NON_RECURSIVE = "N";
235 public static final String UPDATE_SNAPSHOTS = "U";
236 public static final String ACTIVATE_PROFILES = "P";
237 public static final String SUPPRESS_SNAPSHOT_UPDATES = "nsu";
238 public static final String CHECKSUM_FAILURE_POLICY = "C";
239 public static final String CHECKSUM_WARNING_POLICY = "c";
240 public static final String FAIL_FAST = "ff";
241 public static final String FAIL_AT_END = "fae";
242 public static final String FAIL_NEVER = "fn";
243 public static final String RESUME = "r";
244 public static final String RESUME_FROM = "rf";
245 public static final String PROJECT_LIST = "pl";
246 public static final String ALSO_MAKE = "am";
247 public static final String ALSO_MAKE_DEPENDENTS = "amd";
248 public static final String THREADS = "T";
249 public static final String BUILDER = "b";
250 public static final String NO_TRANSFER_PROGRESS = "ntp";
251 public static final String CACHE_ARTIFACT_NOT_FOUND = "canf";
252 public static final String STRICT_ARTIFACT_DESCRIPTOR_POLICY = "sadp";
253 public static final String IGNORE_TRANSITIVE_REPOSITORIES = "itr";
254 public static final String AT_FILE = "af";
255
256 @Override
257 protected void prepareOptions(org.apache.commons.cli.Options options) {
258 super.prepareOptions(options);
259 options.addOption(Option.builder(ALTERNATE_POM_FILE)
260 .longOpt("file")
261 .hasArg()
262 .desc("Force the use of an alternate POM file (or directory with pom.xml)")
263 .build());
264 options.addOption(Option.builder(NON_RECURSIVE)
265 .longOpt("non-recursive")
266 .desc(
267 "Do not recurse into sub-projects. When used together with -pl, do not recurse into sub-projects of selected aggregators")
268 .build());
269 options.addOption(Option.builder(UPDATE_SNAPSHOTS)
270 .longOpt("update-snapshots")
271 .desc("Forces a check for missing releases and updated snapshots on remote repositories")
272 .build());
273 options.addOption(Option.builder(ACTIVATE_PROFILES)
274 .longOpt("activate-profiles")
275 .desc(
276 "Comma-delimited list of profiles to activate. Prefixing a profile with ! excludes it, and ? marks it as optional")
277 .hasArg()
278 .build());
279 options.addOption(Option.builder(SUPPRESS_SNAPSHOT_UPDATES)
280 .longOpt("no-snapshot-updates")
281 .desc("Suppress SNAPSHOT updates")
282 .build());
283 options.addOption(Option.builder(CHECKSUM_FAILURE_POLICY)
284 .longOpt("strict-checksums")
285 .desc("Fail the build if checksums don't match")
286 .build());
287 options.addOption(Option.builder(CHECKSUM_WARNING_POLICY)
288 .longOpt("lax-checksums")
289 .desc("Warn if checksums don't match")
290 .build());
291 options.addOption(Option.builder(FAIL_FAST)
292 .longOpt("fail-fast")
293 .desc("Stop at first failure in reactorized builds")
294 .build());
295 options.addOption(Option.builder(FAIL_AT_END)
296 .longOpt("fail-at-end")
297 .desc("Only fail the build afterwards; allow all non-impacted builds to continue")
298 .build());
299 options.addOption(Option.builder(FAIL_NEVER)
300 .longOpt("fail-never")
301 .desc("NEVER fail the build, regardless of project result")
302 .build());
303 options.addOption(Option.builder(RESUME)
304 .longOpt("resume")
305 .desc(
306 "Resume reactor from the last failed project, using the resume.properties file in the build directory")
307 .build());
308 options.addOption(Option.builder(RESUME_FROM)
309 .longOpt("resume-from")
310 .hasArg()
311 .desc("Resume reactor from specified project")
312 .build());
313 options.addOption(Option.builder(PROJECT_LIST)
314 .longOpt("projects")
315 .desc(
316 "Comma-delimited list of specified reactor projects to build instead of all projects. A project can be specified by [groupId]:artifactId or by its relative path. Prefixing a project with ! excludes it, and ? marks it as optional")
317 .hasArg()
318 .build());
319 options.addOption(Option.builder(ALSO_MAKE)
320 .longOpt("also-make")
321 .desc("If project list is specified, also build projects required by the list")
322 .build());
323 options.addOption(Option.builder(ALSO_MAKE_DEPENDENTS)
324 .longOpt("also-make-dependents")
325 .desc("If project list is specified, also build projects that depend on projects on the list")
326 .build());
327 options.addOption(Option.builder(THREADS)
328 .longOpt("threads")
329 .hasArg()
330 .desc("Thread count, for instance 4 (int) or 2C/2.5C (int/float) where C is core multiplied")
331 .build());
332 options.addOption(Option.builder(BUILDER)
333 .longOpt("builder")
334 .hasArg()
335 .desc("The id of the build strategy to use")
336 .build());
337 options.addOption(Option.builder(NO_TRANSFER_PROGRESS)
338 .longOpt("no-transfer-progress")
339 .desc("Do not display transfer progress when downloading or uploading")
340 .build());
341 options.addOption(Option.builder(CACHE_ARTIFACT_NOT_FOUND)
342 .longOpt("cache-artifact-not-found")
343 .hasArg()
344 .desc(
345 "Defines caching behaviour for 'not found' artifacts. Supported values are 'true' (default), 'false'.")
346 .build());
347 options.addOption(Option.builder(STRICT_ARTIFACT_DESCRIPTOR_POLICY)
348 .longOpt("strict-artifact-descriptor-policy")
349 .hasArg()
350 .desc(
351 "Defines 'strict' artifact descriptor policy. Supported values are 'true', 'false' (default).")
352 .build());
353 options.addOption(Option.builder(IGNORE_TRANSITIVE_REPOSITORIES)
354 .longOpt("ignore-transitive-repositories")
355 .desc("If set, Maven will ignore remote repositories introduced by transitive dependencies.")
356 .build());
357 options.addOption(Option.builder(AT_FILE)
358 .longOpt("at-file")
359 .hasArg()
360 .desc(
361 "If set, Maven will load command line options from the specified file and merge with CLI specified ones.")
362 .build());
363 }
364 }
365 }