Apache.Commons.CLI
The Apache Commons CLI library provides an API for parsing command line options passed to programs. It's also able to print help messages detailing the options available for a command line tool.
Commons CLI supports different types of options:
- POSIX like options (ie.
tar -zxvf foo.tar.gz
) - GNU like long options (ie.
du --human-readable --max-depth=1
) - Java like properties (ie.
java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo
) - Short options with value attached (ie.
gcc -O2 foo.c
) - long options with single hyphen (ie.
ant -projecthelp
)
Maven倉庫
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.3</version>
</dependency>
Example:
如果想要得到下面的一個參數(shù)列表:
java wordcount [-help] [-O][value] [-c] <filename> otherfilename
//演示使用的是1.3的版本
public static void main(String[] args) throws IOException, ParseException {
//option的容器
Options options = new Options();
//boolean型的option
options.addOption("help",false,"help information");
//當?shù)诙?shù)是true時牙言,可以是這樣的參數(shù) -O4
options.addOption("O",true,"you can set a value after the O");
Option c = Option.builder("c") //option的名字,判斷的時候要使用這個名字
.required(false) //是否必須有這個選項
.hasArg() //帶一個參數(shù)
.argName("filename") //參數(shù)的名字
.desc("return sum of characters") //描述
.build(); //必須有
//將c這個option添加進去
options.addOption(c);
//parser
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options,args);
//詢問是否有help
if(cmd.hasOption("help")) {
//調(diào)用默認的help函數(shù)打印
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "java wordcount [OPTION] <FILENAME>", options );
return;
}
if(cmd.hasOption("c")){
// 獲得相應的選項(c)的參數(shù)
String filename = cmd.getOptionValue("c");
System.out.println(filename);
// do something
}
//將除了選項之外的參數(shù)打印出來 otherfilename
String[] s = cmd.getArgs();
for(String e : s){
System.out.println("="+e);
}
PS:自己的CommandLine Parser即是Scanner
疑惑
Option c = Option.builder("c") //option的名字 貌似沒什么卵用?
.required(false) //是否必須有這個選項
.hasArg() //帶一個參數(shù)
.argName("filename") //參數(shù)的名字
.desc("return sum of characters") //描述
.build(); //必須有
為什么創(chuàng)建Option的時候要用一個build這樣一個中間的類來創(chuàng)建粱檀,不直接使用new之類的關(guān)鍵字創(chuàng)建不是更好嗎?反正我看了一下build()
函數(shù)也只是將屬性直接賦值過去而已癣朗?是用了什么設計模式嗎珠洗?還是為了安全考慮誓斥?
其實最后還是內(nèi)部給new出來了不是嗎?
public Option build()
{
if (opt == null && longOpt == null)
{
throw new IllegalArgumentException("Either opt or longOpt must be specified");
}
return new Option(this);
}
然后就是直接復制過去祝钢,其實完全可以將Builder中的一些函數(shù)給Option中催跪,不是嗎?
private Option(final Builder builder)
{
this.argName = builder.argName;
this.description = builder.description;
this.longOpt = builder.longOpt;
this.numberOfArgs = builder.numberOfArgs;
this.opt = builder.opt;
this.optionalArg = builder.optionalArg;
this.required = builder.required;
this.type = builder.type;
this.valuesep = builder.valuesep;
}