mirror of https://github.com/apache/maven.git
[MNG-7651] Simplify and document merge of maven.config file and CLI args
This closes #939
This commit is contained in:
parent
331c5c3435
commit
074879ff28
|
@ -326,35 +326,33 @@ public class MavenCli {
|
|||
|
||||
cliManager = new CLIManager();
|
||||
|
||||
List<String> args = new ArrayList<>();
|
||||
CommandLine mavenConfig = null;
|
||||
try {
|
||||
File configFile = new File(cliRequest.multiModuleProjectDirectory, MVN_MAVEN_CONFIG);
|
||||
|
||||
if (configFile.isFile()) {
|
||||
for (String arg : Files.readAllLines(configFile.toPath(), Charset.defaultCharset())) {
|
||||
if (!arg.isEmpty()) {
|
||||
args.add(arg);
|
||||
}
|
||||
}
|
||||
|
||||
mavenConfig = cliManager.parse(args.toArray(new String[0]));
|
||||
List<?> unrecongized = mavenConfig.getArgList();
|
||||
if (!unrecongized.isEmpty()) {
|
||||
throw new ParseException("Unrecognized maven.config entries: " + unrecongized);
|
||||
String[] args = Files.lines(configFile.toPath(), Charset.defaultCharset())
|
||||
.filter(arg -> !arg.isEmpty())
|
||||
.toArray(size -> new String[size]);
|
||||
mavenConfig = cliManager.parse(args);
|
||||
List<?> unrecognized = mavenConfig.getArgList();
|
||||
if (!unrecognized.isEmpty()) {
|
||||
// This file can only contain options, not args (goals or phases)
|
||||
throw new ParseException("Unrecognized maven.config file entries: " + unrecognized);
|
||||
}
|
||||
}
|
||||
} 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);
|
||||
throw e;
|
||||
}
|
||||
|
||||
try {
|
||||
CommandLine mavenCli = cliManager.parse(cliRequest.args);
|
||||
if (mavenConfig == null) {
|
||||
cliRequest.commandLine = cliManager.parse(cliRequest.args);
|
||||
cliRequest.commandLine = mavenCli;
|
||||
} else {
|
||||
cliRequest.commandLine = cliMerge(cliManager.parse(cliRequest.args), mavenConfig);
|
||||
cliRequest.commandLine = cliMerge(mavenConfig, mavenCli);
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
System.err.println("Unable to parse command line options: " + e.getMessage());
|
||||
|
@ -379,20 +377,26 @@ public class MavenCli {
|
|||
}
|
||||
}
|
||||
|
||||
private CommandLine cliMerge(CommandLine mavenArgs, CommandLine mavenConfig) {
|
||||
private CommandLine cliMerge(CommandLine mavenConfig, CommandLine mavenCli) {
|
||||
CommandLine.Builder commandLineBuilder = new CommandLine.Builder();
|
||||
|
||||
// the args are easy, cli first then config file
|
||||
for (String arg : mavenArgs.getArgs()) {
|
||||
commandLineBuilder.addArg(arg);
|
||||
}
|
||||
for (String arg : mavenConfig.getArgs()) {
|
||||
// the args are easy, CLI only since maven.config file can only contain options
|
||||
for (String arg : mavenCli.getArgs()) {
|
||||
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<>();
|
||||
for (Option opt : mavenArgs.getOptions()) {
|
||||
for (Option opt : mavenCli.getOptions()) {
|
||||
if (String.valueOf(CLIManager.SET_USER_PROPERTY).equals(opt.getOpt())) {
|
||||
setPropertyOptions.add(opt);
|
||||
} else {
|
||||
|
|
|
@ -175,7 +175,7 @@ public class MavenCliTest {
|
|||
cli.cli(request);
|
||||
cli.properties(request);
|
||||
|
||||
String revision = System.getProperty("revision");
|
||||
String revision = request.getUserProperties().getProperty("revision");
|
||||
assertEquals("8.1.0", revision);
|
||||
}
|
||||
|
||||
|
@ -204,7 +204,7 @@ public class MavenCliTest {
|
|||
cli.cli(request);
|
||||
cli.properties(request);
|
||||
|
||||
String revision = System.getProperty("revision");
|
||||
String revision = request.getUserProperties().getProperty("revision");
|
||||
assertEquals("8.2.0", revision);
|
||||
}
|
||||
|
||||
|
@ -239,7 +239,7 @@ public class MavenCliTest {
|
|||
|
||||
assertEquals("3", request.commandLine.getOptionValue(CLIManager.THREADS));
|
||||
|
||||
String revision = System.getProperty("revision");
|
||||
String revision = request.getUserProperties().getProperty("revision");
|
||||
assertEquals("8.2.0", revision);
|
||||
|
||||
assertEquals("bar ", request.getUserProperties().getProperty("foo"));
|
||||
|
|
Loading…
Reference in New Issue