--- old/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java 2017-03-22 17:16:24.000000000 -0700 +++ new/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java 2017-03-22 17:16:24.000000000 -0700 @@ -37,6 +37,9 @@ import java.util.List; import java.util.MissingResourceException; import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import jdk.internal.jimage.BasicImageReader; import jdk.internal.jimage.ImageHeader; import jdk.internal.jimage.ImageLocation; @@ -99,7 +102,7 @@ } static class OptionsValues { - Task task = Task.LIST; + Task task = null; String directory = "."; String include = ""; boolean fullVersion; @@ -172,24 +175,31 @@ } try { - List unhandled = OPTION_HELPER.handleOptions(this, args); + String command; + String[] remaining = args; + try { + command = args[0]; + options.task = Enum.valueOf(Task.class, args[0].toUpperCase()); + remaining = args.length > 1 ? Arrays.copyOfRange(args, 1, args.length) + : new String[0]; + } catch (IllegalArgumentException ex) { + command = null; + options.task = null; + } - if(!unhandled.isEmpty()) { - try { - options.task = Enum.valueOf(Task.class, unhandled.get(0).toUpperCase()); - } catch (IllegalArgumentException ex) { - throw TASK_HELPER.newBadArgs("err.not.a.task", unhandled.get(0)); - } + // process arguments + List unhandled = OPTION_HELPER.handleOptions(this, remaining); + for (String f : unhandled) { + options.jimages.add(new File(f)); + } - for(int i = 1; i < unhandled.size(); i++) { - options.jimages.add(new File(unhandled.get(i))); - } - } else if (!options.help && !options.version && !options.fullVersion) { - throw TASK_HELPER.newBadArgs("err.invalid.task", ""); + if (options.task == null && !options.help && !options.version && !options.fullVersion) { + throw TASK_HELPER.newBadArgs("err.not.a.task", + command != null ? command : ""); } if (options.help) { - if (unhandled.isEmpty()) { + if (options.task == null) { log.println(TASK_HELPER.getMessage("main.usage", PROGNAME)); Arrays.asList(RECOGNIZED_OPTIONS).stream() .filter(option -> !option.isHidden()) @@ -203,15 +213,19 @@ log.println(TASK_HELPER.getMessage("main.usage." + options.task.toString().toLowerCase())); } catch (MissingResourceException ex) { - throw TASK_HELPER.newBadArgs("err.not.a.task", unhandled.get(0)); + throw TASK_HELPER.newBadArgs("err.not.a.task", command); } } return EXIT_OK; } if (options.version || options.fullVersion) { - TASK_HELPER.showVersion(options.fullVersion); + if (options.task == null && !unhandled.isEmpty()) { + throw TASK_HELPER.newBadArgs("err.not.a.task", + Stream.of(args).collect(Collectors.joining(" "))); + } + TASK_HELPER.showVersion(options.fullVersion); if (unhandled.isEmpty()) { return EXIT_OK; } @@ -435,7 +449,7 @@ iterate(this::listTitle, null, this::verify); break; default: - throw TASK_HELPER.newBadArgs("err.invalid.task", + throw TASK_HELPER.newBadArgs("err.not.a.task", options.task.name()).showUsage(true); } return true;