java 命令行解析工具包 jopt-simple

java 解析命令行工具包 jopt-simple

gradle依赖如下

compile 'net.sf.jopt-simple:jopt-simple:5.0.2'

maven依赖如下


    net.sf.jopt-simple
    jopt-simple
    5.0.2

支持POSIX格式和GNU格式的命令行参数,短的选项参数格式and长的选项参数格式都支持。

短格式选项


短的选项参数,用一个-开头,后面跟一个数字或者字母;或者是一个英文的问号?,英文的点号.,英文的下划线_
短的选项参数支持单个参数值,值可以是必填的也可以是选填的,可以用如下格式:

  • 在参数名后加个空格,如-d /tmp
  • 紧跟在参数名后面,如-d/tmp
  • 在参数名后用等号=连接,如-d=/tmp

为了实现一个参数对应多个参数值,可以多次使用同一参数名,每次对应一个参数值,例如-d /tmp -d /var -d /opt;
当使用了ArgumentAcceptingOptionSpec#withValuesSeparatedBy(char) "separated values"配置了分隔符时,多值可以用流式的方法书写,多个值可以用这里配置好的分隔符分割。例如

parser.accepts( "z" ).withRequiredArg()
       .withValuesSeparatedBy( ',' );
OptionSet options = parser.parse( new String[] { "-z", "foo,bar,baz", "-z",
       "fizz", "-z", "buzz" } );

使用options.valuesOf( "z" ) 得到的值如下[foo, bar, baz, fizz, buzz]

短的参数选项可以被聚合在一块写,例如-abc 可以看成是-a -b -c。如果这些参数是可以配置参数值的,那么后面的字符会被认定为参数值。
这里容易出错
-d是可以配置参数值的,那么-dabc不会被看成-d -a -b -c,而是会把abc看成是-d参数的参数值。

如果参数值只包含两个短横线--,后面的字符不会被认定为参数

如果参数值只包含一个短横线-,那么不会被认为是参数值(虽然理论上-可以是一个参数值)。因为很多unix程序都会把单个-看成是内建的输入输出流。

长格式选项


长的选项参数,用2个--开头,跟着多个英文字符、数字、短线、问号、点号。单个-不能是长选项参数的第一个字符。

长的参数可以用缩写,只要缩写的唯一的。可以在OptionParser的构造函数中配置是否可以使用缩写。

长的选项参数接受单个参数值,值可以是必填也可以是选填。可以用如下格式:

  • 在参数名后加个空格,如--directory /tmp
  • 在参数名后用等号=连接,如--directory=/tmp

多个参数值的处理方式和短的参数格式一致。

参数名-W是保留字,当使用recognizeAlternativeLongOptions(boolean)配置了可识别替换长参数时,-W foo=bar将被看成是--foo=bar
可以将-W当做是短的参数或者长参数的缩写,但是recognizeAlternativeLongOptions(boolean)会覆盖这种行为。

其他


当parser检测到一个参数的参数值是可选的,并且后面跟的一串字符“看上去”像是参数(不是参数值),那么这串字符就会认为是另一个参数,前一个参数没有参数值。
如果,另一方面,一个可选的参数值被识别为数字,那么参数值将被看作是一个负数,即使parser识别出来相应的数字选项参数名。例如:
parser.parse("-a", "-2");
此时,参数a的值是-2, 不会将a, 2都当做是参数名。

有2种方法告诉parser识别哪些参数:

  • 采用“流式”(fluent interface)风格的API设置options。采用accepts(String)或者acceptsAll(List)方法;调用链后面的方法描述了这个选项是否有参数值、参数值是必填还是选填,参数值应该转换成什么类型等。从版本3开始,这些方法调用返回OptionSpec,这将返回类型安全的参数值。

  • 从版本1开始,一种更加简洁的方法用于设置短格式选项OptionParser。这些选项的参数值默认是String类型。以下是设置特定字符串的规则:

  1. 任务字符或者数字被当做是一个选项
  2. 一个选项可以紧跟一个星号,表明这个选项是help选项
  3. 如果一个选项字符紧跟一个冒号:,意味着这个选项需要必填参数值
  4. 如果一个选项字符紧跟两个冒号::,那么这个选项接受可选的参数值
  5. 否则,这个选项不接受参数值
  6. 如果一个选项用一个加号+开始,这个parser和'POSIX-ly correct'方式一致
  7. 如果选项字符串包含W;parser将作为长格式的替换

acceptsAll方法参数列表中的每个选项都被认为是其他选项的同义词,例如:

OptionParser parser = new OptionParser();
parser.acceptsAll( asList( "w", "interactive", "confirmation" ) );
OptionSet options = parser.parse( "-w" );

你可能感兴趣的:(java 命令行解析工具包 jopt-simple)