JEP 293: Guidelines for JDK Command-Line Tool Options

Stuart Marks stuart.marks at oracle.com
Wed Jul 13 20:12:54 UTC 2016


On 7/7/16 12:16 PM, mark.reinhold at oracle.com wrote:
> New JEP Candidate: http://openjdk.java.net/jeps/293

Hi Jon,

Good writeup and rundown of the issues.

I have a few questions to raise.

     options can allow an argument to be provided

This describes an option with an optional argument. I recommend disallowing or 
at least strongly discouraging this, as it leads to ambiguities in options 
parsing. For example, suppose <value> is optional:

     cmd --example-option <value>

Suppose we have a case where the value begins with a minus and it happens to 
look like a valid option:

     cmd --example-option -l

Is -l the argument to --example-option, or is it the separate -l option? One 
could define a disambiguation rule, but this doesn't seem like a very good idea. 
It will be confusing at best.

Suppose what follows isn't a valid option:

     cmd --example-option -x

There's no ambiguity here, at least not yet; "-x" would the argument for 
--example-option. But suppose a -x option were added in a later version of the 
tool. This could introduce an ambiguity and potential incompatibility with 
existing scripts.

     Single character options may be grouped into a single token. For
     example, if -a and -b are single character options, they may be
     specified together on the command line as -ab.

This might be reasonable for greenfield tools that support only "pure" GNU-style 
options and not any legacy JDK options. But for tools that support single-minus 
long options, such as "-cp", "-version", and so forth, this introduces a bunch 
of weirdness if not outright ambiguity.

For example, suppose an existing tool supports the -cp option, and it also 
supports -c and -p. Then -cp would mean --class-path, but -pc means -p -c. Given 
some other option like -l, then -cpl would mean -c -p -l. But if one wanted to 
remove the -l option, one couldn't simply remove the "l", since that would 
result in "-cp", yielding --class-path instead of -c -p.

This is acknowledged a few paragraphs later,

     Some forms on the command-line may be ambiguous; tools may try and be
     clever to disambiguate such cases. In general, tools are encouraged not
     to support combinations which might be ambiguous, and users are encouraged
     not to use forms which might be ambiguous. For example, tools which support
     the old short form option -cp for classpath may choose not to support both
     -c and -p as single-character forms for new options.

I think the recommendation should be stronger. I'd advise against tools trying 
to be clever; this leads directly to inconsistency and confusing behavior.

If users are discouraged from using ambiguous forms, maybe we shouldn't allow 
potentially ambiguous forms in the first place.

I observe that -p is the recommended short form for --module-path. Note that 
this takes an argument. So -pc would set the module path to "c". Hm.

An alternative restriction would be to disallow single-letter option grouping in 
cases where one of the options takes an argument.

     The use of -X as a prefix to indicate "non-standard" options will be
     discontinued for new options, although command-line help may continue to
     draw a distinction between more commonly used options and those for
     advanced use.

Is there a replacement convention? Sometimes it's useful to have "hidden" or 
diagnostic or debugging options that aren't supported, subject to change, etc. I 
thought the -X prefix was used for things like that. But if not -X, should there 
be something else?

     Given the existing support for -cp as a short form for -classpath, a
     single character form will not be introduced.

Is there a recommendation for new tools? Clearly --class-path should be 
supported, but what about a short form? One could use "-cp" but this brings in 
the grouping ambiguity issues into brand-new tools, almost implying that there 
will never be any tools with pure-GNU option syntax. (But maybe that's OK.)

On the other hand, I'm not sure what a reasonable single-letter option would be. 
Somebody would have to examine the existing tools to see if something like -c or 
-C is available.

     --add-reads <module>=<target-module>(,<target-module>)*

Just to clarify, is the = separator supported here as well, implying that the 
following would be permitted?

     --add-reads=modname=targetmod1,targetmod2

I don't think this is ambiguous; it merely looks a bit odd.

--

In summary, my two main issues are 1) options with optional arguments; and 2) 
grouping of single-letter options. I'd like to see these disallowed, or at the 
very least a stronger recommendation against them.

Thanks,

s'marks


More information about the core-libs-dev mailing list