java 解析命令行工具包 jopt-simple
gradle依赖如下
compile 'net.sf.jopt-simple:jopt-simple:5.0.2'
maven依赖如下
<dependency>
<groupId>net.sf.jopt-simple</groupId>
<artifactId>jopt-simple</artifactId>
<version>5.0.2</version>
</dependency>
支持POSIX
格式和GNU
格式的命令行参数,短的选项参数格式and长的选项参数格式都支持。
短格式选项
短的选项参数,用一个-
开头,后面跟一个数字或者字母;或者是一个英文的问号?
,英文的点号.
,英文的下划线_
短的选项参数支持单个参数值,值可以是必填的也可以是选填的,可以用如下格式:
- 在参数名后加个空格,如
-d /tmp
- 紧跟在参数名后面,如
-d/tmp
- 在参数名后用等号
=
连接,如-d=/tmp
为了实现一个参数对应多个参数值,可以多次使用同一参数名,每次对应一个参数值,例如-d /tmp -d /var -d /opt
;
当使用了ArgumentAcceptingOptionSpec#withValuesSeparatedBy(char) "separated values"
配置了分隔符时,多值可以用流式的方法书写,多个值可以用这里配置好的分隔符分割。例如
parser.accepts( "z" ).withRequiredArg()
.<strong>withValuesSeparatedBy( ',' )</strong>;
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
类型。以下是设置特定字符串的规则:
- 任务字符或者数字被当做是一个选项
- 一个选项可以紧跟一个星号,表明这个选项是
help
选项 - 如果一个选项字符紧跟一个冒号
:
,意味着这个选项需要必填参数值 - 如果一个选项字符紧跟两个冒号
::
,那么这个选项接受可选的参数值 - 否则,这个选项不接受参数值
- 如果一个选项用一个加号
+
开始,这个parser
和'POSIX-ly correct'方式一致 - 如果选项字符串包含
W;
,parser
将作为长格式的替换
acceptsAll
方法参数列表中的每个选项都被认为是其他选项的同义词,例如:
OptionParser parser = new OptionParser();
parser.acceptsAll( asList( "w", "interactive", "confirmation" ) );
OptionSet options = parser.parse( "-w" );