Java命令行参数解析

时间:2023-03-08 21:54:09
Java命令行参数解析

参考  http://blog.csdn.net/mldxs/article/details/36204079

http://rensanning.iteye.com/blog/2161201

import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.CommandLine; public static void main(String[] args) throws Exception {
// Create a Parser
CommandLineParser parser = new BasicParser( );
Options options = new Options( );
options.addOption("h", "help", false, "Print this usage information");
options.addOption("v", "verbose", false, "Print out VERBOSE information" );
options.addOption("f", "file", true, "File to save program output to");
// Parse the program arguments
CommandLine commandLine = parser.parse( options, args );
// Set the appropriate variables based on supplied options
boolean verbose = false;
String file = ""; if( commandLine.hasOption('h') ) {
System.out.println( "Help Message")
System.exit(0);
}
if( commandLine.hasOption('v') ) {
verbose = true;
}
if( commandLine.hasOption('f') ) {
file = commandLine.getOptionValue('f');
}
}
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency> 熟悉Linux命令的都知道几乎所有程序都会提供一些命令行选项。而命令行选项有两种风格:以“-”开头的单个字符的POSIX风格;以“--”后接选项关键字的GNU风格。  假定我们的程序需要以下选项: 
引用
Options:
-t,--text use given information(String)
-b display current time(boolean)
-s,--size use given size(Integer)
-f,--file use given file(File)
-D <property=value> use value for given property(property=value)
(1)Apache的Commons-CLI 
版本:commons-cli-1.2.jar  支持三种CLI选项解析: 
  • BasicParser:直接返回参数数组值
  • PosixParser:解析参数及值(-s10)
  • GnuParser:解析参数及值(--size=10)
对于动态参数: 
-Dkey=value  需要代码设置参数,返回类型需要转换。 
args = new String[]{"-t", "rensanning", "-f", "c:/aa.txt", "-b", "-s10", "-Dkey1=value1", "-Dkey2=value2" };  

try {
// create Options object
Options options = new Options();
options.addOption(new Option("t", "text", true, "use given information(String)"));
options.addOption(new Option("b", false, "display current time(boolean)"));
options.addOption(new Option("s", "size", true, "use given size(Integer)"));
options.addOption(new Option("f", "file", true, "use given file(File)")); @SuppressWarnings("static-access")
Option property = OptionBuilder.withArgName("property=value")
.hasArgs(2)
.withValueSeparator()
.withDescription("use value for given property(property=value)")
.create("D");
property.setRequired(true);
options.addOption(property); // print usage
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "AntOptsCommonsCLI", options );
System.out.println(); // create the command line parser
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args); // check the options have been set correctly
System.out.println(cmd.getOptionValue("t"));
System.out.println(cmd.getOptionValue("f"));
if (cmd.hasOption("b")) {
System.out.println(new Date());
}
System.out.println(cmd.getOptionValue( "s" ));
System.out.println(cmd.getOptionProperties("D").getProperty("key1") );
System.out.println(cmd.getOptionProperties("D").getProperty("key2") ); } catch (Exception ex) {
System.out.println( "Unexpected exception:" + ex.getMessage() );
}
(2)Args4J 
版本:args4j-2.0.29.jar  基于注解。 
args = new String[] {"-t", "rensanning", "-f", "c:/aa.txt", "-b", "-s", "10", "-D", "key1=value1" , "-D", "key2=value2"};  

try {
Args4jOptions options = new Args4jOptions();
CmdLineParser parser = new CmdLineParser(options); // print usage
parser.printUsage(System.out);
System.out.println(); parser.parseArgument(args); // check the options have been set correctly
System.out.println(options.getText());
System.out.println(options.getFile().getName());
if(options.isBol()) {
System.out.println(new Date());
}
System.out.println(options.getSize());
System.out.println(options.getProperties().get("key1"));
System.out.println(options.getProperties().get("key2")); } catch (Exception ex) {
System.out.println("Unexpected exception:" + ex.getMessage());
}
@Option(name = "-t", aliases = "-text", usage = "use given information(String)")
private String text;
@Option(name = "-b", usage = "display current time(boolean)")
private boolean bol = false;
@Option(name = "-s", aliases = "-size", usage = "use given size(Integer)")
private int size = 0;
@Option(name = "-f", aliases = { "-file" }, metaVar = "<file>", usage = "use given file(File)")
private File file; private Map<String, String> properties = new HashMap<String, String>();
@Option(name = "-D", metaVar = "<property>=<value>", usage = "use value for given property(property=value)")
public void setProperty(final String property) {
String[] arr = property.split("=");
properties.put(arr[0], arr[1]);
}
(3)JCommander 
版本:jcommander-1.45.jar  基于注解、TestNG作者开发。