[MNG-7651] Simplify and document merge of maven.config file and CLI args

This closes #939
This commit is contained in:
Michael Osipov 2022-12-26 18:29:11 +01:00
parent 6178f6ed86
commit 5af08d0052
2 changed files with 27 additions and 23 deletions

View File

@ -339,35 +339,33 @@ public class MavenCli {
cliManager = new CLIManager(); cliManager = new CLIManager();
List<String> args = new ArrayList<>();
CommandLine mavenConfig = null; CommandLine mavenConfig = null;
try { try {
File configFile = new File(cliRequest.multiModuleProjectDirectory, MVN_MAVEN_CONFIG); File configFile = new File(cliRequest.multiModuleProjectDirectory, MVN_MAVEN_CONFIG);
if (configFile.isFile()) { if (configFile.isFile()) {
for (String arg : Files.readAllLines(configFile.toPath(), Charset.defaultCharset())) { String[] args = Files.lines(configFile.toPath(), Charset.defaultCharset())
if (!arg.isEmpty()) { .filter(arg -> !arg.isEmpty())
args.add(arg); .toArray(size -> new String[size]);
} mavenConfig = cliManager.parse(args);
}
mavenConfig = cliManager.parse(args.toArray(new String[0]));
List<?> unrecognized = mavenConfig.getArgList(); List<?> unrecognized = mavenConfig.getArgList();
if (!unrecognized.isEmpty()) { if (!unrecognized.isEmpty()) {
throw new ParseException("Unrecognized maven.config entries: " + unrecognized); // This file can only contain options, not args (goals or phases)
throw new ParseException("Unrecognized maven.config file entries: " + unrecognized);
} }
} }
} catch (ParseException e) { } catch (ParseException e) {
System.err.println("Unable to parse maven.config: " + e.getMessage()); System.err.println("Unable to parse maven.config file options: " + e.getMessage());
cliManager.displayHelp(System.out); cliManager.displayHelp(System.out);
throw e; throw e;
} }
try { try {
CommandLine mavenCli = cliManager.parse(cliRequest.args);
if (mavenConfig == null) { if (mavenConfig == null) {
cliRequest.commandLine = cliManager.parse(cliRequest.args); cliRequest.commandLine = mavenCli;
} else { } else {
cliRequest.commandLine = cliMerge(cliManager.parse(cliRequest.args), mavenConfig); cliRequest.commandLine = cliMerge(mavenConfig, mavenCli);
} }
} catch (ParseException e) { } catch (ParseException e) {
System.err.println("Unable to parse command line options: " + e.getMessage()); System.err.println("Unable to parse command line options: " + e.getMessage());
@ -392,20 +390,26 @@ public class MavenCli {
} }
} }
private CommandLine cliMerge(CommandLine mavenArgs, CommandLine mavenConfig) { private CommandLine cliMerge(CommandLine mavenConfig, CommandLine mavenCli) {
CommandLine.Builder commandLineBuilder = new CommandLine.Builder(); CommandLine.Builder commandLineBuilder = new CommandLine.Builder();
// the args are easy, cli first then config file // the args are easy, CLI only since maven.config file can only contain options
for (String arg : mavenArgs.getArgs()) { for (String arg : mavenCli.getArgs()) {
commandLineBuilder.addArg(arg);
}
for (String arg : mavenConfig.getArgs()) {
commandLineBuilder.addArg(arg); commandLineBuilder.addArg(arg);
} }
// now add all options, except for -D with cli first then config file /* Although this looks wrong in terms of order Commons CLI stores the value of options in
* an array and when a value is potentionally overriden it is added to the array. The single
* arg option value is retrieved and instead of returning values[values.length-1] it returns
* values[0] which means that the original value instead of the overridden one is returned
* (first wins). With properties values are truely overriden since at the end a map is used
* to merge which means last wins.
*
* TODO Report this behavioral bug with Commons CLI
*/
// now add all options, except for user properties with CLI first then maven.config file
List<Option> setPropertyOptions = new ArrayList<>(); List<Option> setPropertyOptions = new ArrayList<>();
for (Option opt : mavenArgs.getOptions()) { for (Option opt : mavenCli.getOptions()) {
if (String.valueOf(CLIManager.SET_USER_PROPERTY).equals(opt.getOpt())) { if (String.valueOf(CLIManager.SET_USER_PROPERTY).equals(opt.getOpt())) {
setPropertyOptions.add(opt); setPropertyOptions.add(opt);
} else { } else {

View File

@ -244,7 +244,7 @@ public class MavenCliTest {
cli.cli(request); cli.cli(request);
cli.properties(request); cli.properties(request);
String revision = System.getProperty("revision"); String revision = request.getUserProperties().getProperty("revision");
assertEquals("8.1.0", revision); assertEquals("8.1.0", revision);
} }
@ -273,7 +273,7 @@ public class MavenCliTest {
cli.cli(request); cli.cli(request);
cli.properties(request); cli.properties(request);
String revision = System.getProperty("revision"); String revision = request.getUserProperties().getProperty("revision");
assertEquals("8.2.0", revision); assertEquals("8.2.0", revision);
} }
@ -308,7 +308,7 @@ public class MavenCliTest {
assertEquals("3", request.commandLine.getOptionValue(CLIManager.THREADS)); assertEquals("3", request.commandLine.getOptionValue(CLIManager.THREADS));
String revision = System.getProperty("revision"); String revision = request.getUserProperties().getProperty("revision");
assertEquals("8.2.0", revision); assertEquals("8.2.0", revision);
assertEquals("bar ", request.getUserProperties().getProperty("foo")); assertEquals("bar ", request.getUserProperties().getProperty("foo"));