Commons CLI - 快速指南
Apache Commons CLI - Overview
Apache Commons CLI是Apache Commons的组件,它们派生自Java API,并提供API来解析传递给程序的命令行参数/选项。 此API还可以打印与可用选项相关的帮助。
命令行处理包括三个阶段。
- 定义阶段
- Parsing Stage
- Interrogation Stage
定义阶段
在定义阶段,我们定义应用程序可以采取的相应选项。 Commons CLI提供Options类,它是Option对象的容器。
// create Options object
Options options = new Options();
// add a option
options.addOption("a", false, "add two numbers");
这里我们添加了一个选项标志a,而false则为第二个参数表示该选项不是必需的,第三个参数表示选项的描述。
解析阶段
在解析阶段,我们在创建解析器实例后解析使用命令行参数传递的选项。
//Create a parser
CommandLineParser parser = new DefaultParser();
//parse the options passed as command line arguments
CommandLine cmd = parser.parse( options, args);
审讯阶段
在询问阶段,我们检查是否存在特定选项并相应地处理命令。
//hasOptions checks if option is present or not
if(cmd.hasOption("a")) {
// add the two numbers
} else if(cmd.hasOption("m")) {
// multiply the two numbers
}
Apache Commons CLI - Environment Setup
本地环境设置 (Local Environment Setup)
如果您仍然愿意为Java编程语言设置环境,那么本节将指导您如何在计算机上下载和设置Java。 请按照下面提到的步骤设置环境。
Java SE可从链接Download Java免费获得。 因此,您下载基于您的操作系统的版本。
按照说明下载Java并运行.exe以在您的计算机上安装Java。 在计算机上安装Java后,需要设置环境变量以指向正确的安装目录 -
设置Windows 2000/XP的路径
我们假设您已在c:\Program Files\java\jdk目录中安装了Java -
右键单击“我的电脑”,然后选择“属性”。
单击“高级”选项卡下的“环境变量”按钮。
现在,更改'Path'变量,使其也包含Java可执行文件的路径。 例如,如果路径当前设置为“C:\WINDOWS\SYSTEM32”,则将路径更改为“C:\WINDOWS\SYSTEM32; c:\Program Files\java\jdk\bin”。
设置Windows 95/98/ME的路径
我们假设您已在c:\Program Files\java\jdk目录中安装了Java -
编辑'C:\autoexec.bat'文件并在末尾添加以下行 - 'SET PATH =%PATH%; C:\Program Files\java\jdk\bin'
设置Linux,UNIX,Solaris,FreeBSD的路径
应将环境变量PATH设置为指向已安装Java二进制文件的位置。 如果您在执行此操作时遇到问题,请参阅您的shell文档。
例如,如果你使用bash作为shell,那么你可以将以下行添加到'.bashrc的末尾:export PATH =/path/to/java:$ PATH'
流行的Java编辑器 (Popular Java Editors)
要编写Java程序,需要一个文本编辑器。 市场上有许多复杂的IDE。 但就目前而言,您可以考虑以下其中一项 -
Notepad - 在Windows机器上,您可以使用任何简单的文本编辑器,如记事本(本教程推荐),TextPad。
Netbeans - 它是一个开源和免费的Java IDE,可以从https://www.netbeans.org/index.html下载。
Eclipse - 它也是由eclipse开源社区开发的Java IDE,可以从https://www.eclipse.org/下载。
下载常用CLI存档
从commons-cli-1.4-bin.zip下载最新版本的Apache Common CLI jar文件。 在编写本教程时,我们已经下载了commons-cli-1.4-bin.zip并将其复制到C:\“Apache文件夹中。
OS | 存档名称 |
---|---|
Windows | commons-cli-1.4-bin.zip |
Linux | commons-cli-1.4-bin.tar.gz |
Mac | commons-cli-1.4-bin.tar.gz |
设置Apache Common CLI Environment
将APACHE_HOME环境变量设置为指向Apache jar存储在计算机上的基本目录位置。 假设我们在各种操作系统的Apache文件夹中提取了commons-collections4-4.1-bin.zip,如下所示。
OS | output |
---|---|
Windows | 将环境变量APACHE_HOME设置为C:\Apache |
Linux | export APACHE_HOME =/usr/local/Apache |
Mac | export APACHE_HOME =/Library/Apache |
设置类路径变量 (Set CLASSPATH Variable)
将CLASSPATH环境变量设置为指向Common CLI jar位置。 假设您已将commons-cli-1.4.jar存储在各种操作系统的Apache文件夹中,如下所示。
OS | output |
---|---|
Windows | 将环境变量CLASSPATH设置为%CLASSPATH%;%APACHE_HOME%\ commons-cli-1.4.jar;。; |
Linux | export CLASSPATH = $ CLASSPATH:$ APACHE_HOME/commons-cli-1.4.jar:。 |
Mac | export CLASSPATH = $ CLASSPATH:$ APACHE_HOME/commons-cli-1.4.jar:。 |
Apache Commons CLI - First Application
让我们创建一个基于控制台的示例应用程序,其目的是根据所使用的选项获取传递数字的总和或传递数字的乘法。
创建一个名为CLITester的java类。
例子 (Example)
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
//***Definition Stage***
// create Options object
Options options = new Options();
// add option "-a"
options.addOption("a", false, "add numbers");
// add option "-m"
options.addOption("m", false, "multiply numbers");
//***Parsing Stage***
//Create a parser
CommandLineParser parser = new DefaultParser();
//parse the options passed as command line arguments
CommandLine cmd = parser.parse( options, args);
//***Interrogation Stage***
//hasOptions checks if option is present or not
if(cmd.hasOption("a")) {
System.out.println("Sum of the numbers: " + getSum(args));
} else if(cmd.hasOption("m")) {
System.out.println("Multiplication of the numbers: " + getMultiplication(args));
}
}
public static int getSum(String[] args) {
int sum = 0;
for(int i = 1; i < args.length ; i++) {
sum += Integer.parseInt(args[i]);
}
return sum;
}
public static int getMultiplication(String[] args) {
int multiplication = 1;
for(int i = 1; i < args.length ; i++) {
multiplication *= Integer.parseInt(args[i]);
}
return multiplication;
}
}
输出 (Output)
传递-a作为选项和数字运行文件,以获得数字的总和作为结果。
java CLITester -a 1 2 3 4 5
Sum of the numbers: 15
在传递-m作为选项和数字时运行该文件以获得数字的乘法结果。
java CLITester -m 1 2 3 4 5
Multiplication of the numbers: 120
Apache Commons CLI - Option Properties
Option对象用于表示传递给命令行程序的Option。 以下是Option对象拥有的各种属性。
Sr.No. | 名称(类型)和描述 |
---|---|
1 | opt (String) Option的标识字符串。 |
2 | longOpt (String) 别名和更具描述性的标识字符串。 |
3 | description (String) 选项功能说明。 |
4 | required (boolean) 用于检查选项是否必须出现在命令行上的标志。 |
5 | arg (boolean) 用于检查选项是否接受参数的标志。 |
6 | args (boolean) 用于检查该选项是否包含多个参数的标志。 |
7 | optionalArg (boolean) 用于检查选项参数是否可选的标志。 |
8 | argName (String) 用法语句的参数值的名称。 |
9 | valueSeparator (char) 用于拆分参数字符串的字符值。 |
10 | type (Object) 参数类型。 |
11 | value (String) 期权价值。 |
12 | values (String[]) 选项的值。 |
Apache Commons CLI - Boolean Option
布尔选项在命令行上由其存在表示。 例如,如果选项存在,则其值为true,否则将其视为false。 考虑以下示例,我们打印当前日期,如果存在-t标志,那么我们也将打印时间。
例子 (Example)
CLITester.java
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("t", false, "display time");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
Calendar date = Calendar.getInstance();
int day = date.get(Calendar.DAY_OF_MONTH);
int month = date.get(Calendar.MONTH);
int year = date.get(Calendar.YEAR);
int hour = date.get(Calendar.HOUR);
int min = date.get(Calendar.MINUTE);
int sec = date.get(Calendar.SECOND);
System.out.print(day + "/" + month + "/" + year);
if(cmd.hasOption("t")) {
System.out.print(" " + hour + ":" + min + ":" + sec);
}
}
}
输出 (Output)
在不传递任何选项的情况下运行该文件并查看结果。
java CLITester
12/11/2017
将-t作为选项传递时运行该文件并查看结果。
java CLITester
12/11/2017 4:13:10
Apache Commons CLI - Argument Option
Argument选项在命令行上由其名称及其对应值表示。 例如,如果存在选项,则用户必须传递其值。 请考虑以下示例,如果我们将日志打印到某个文件,我们希望用户使用参数选项logFile输入日志文件的名称。
例子 (Example)
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
Option logfile = Option.builder()
.longOpt("logFile")
.argName("file" )
.hasArg()
.desc("use given file for log" )
.build();
options.addOption(logfile);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
// has the logFile argument been passed?
if(cmd.hasOption("logFile")) {
//get the logFile argument passed
System.out.println( cmd.getOptionValue( "logFile" ) );
}
}
}
输出 (Output)
传递--logFile作为选项时运行该文件,文件名作为选项的值并查看结果。
java CLITester --logFile test.log
test.log
Apache Commons CLI - Properties Option
“属性”选项在命令行上由其名称及其对应的属性表示,类似于java属性文件的语法。 考虑以下示例,如果我们传递-DrollNo = 1 -Dclass = VI -Dname = Mahesh等选项,我们应该将每个值作为属性进行处理。 让我们看看实施逻辑的实际应用。
例子 (Example)
CLITester.java
import java.util.Properties;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
Option propertyOption = Option.builder()
.longOpt("D")
.argName("property=value" )
.hasArgs()
.valueSeparator()
.numberOfArgs(2)
.desc("use value for given properties" )
.build();
options.addOption(propertyOption);
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse( options, args);
if(cmd.hasOption("D")) {
Properties properties = cmd.getOptionProperties("D");
System.out.println("Class: " + properties.getProperty("class"));
System.out.println("Roll No: " + properties.getProperty("rollNo"));
System.out.println("Name: " + properties.getProperty("name"));
}
}
}
输出 (Output)
将选项作为键值对传递时运行该文件并查看结果。
java CLITester -DrollNo=1 -Dclass=VI -Dname=Mahesh
Class: VI
Roll No: 1
Name: Mahesh
Apache Commons CLI - Posix Parser
Posix解析器用于解析Posix,就像传递的参数一样。 它现已弃用,并由DefaultParser取代。
例子 (Example)
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
public class CLITester {
public static void main(String[] args) throws ParseException {
//Create posix like options
Options posixOptions = new Options();
posixOptions.addOption("D", false, "Display");
posixOptions.addOption("A", false, "Act");
CommandLineParser posixParser = new PosixParser();
CommandLine cmd = posixParser.parse(posixOptions, args);
if( cmd.hasOption("D") ) {
System.out.println("D option was used.");
}
if( cmd.hasOption("A") ) {
System.out.println("A option was used.");
}
}
}
输出 (Output)
在传递-D -A作为选项时运行该文件并查看结果。
java CLITester -D -A
D option was used.
A option was used.
传递-D作为选项运行文件并查看结果。
java CLITester --D
D option was used.
Apache Commons CLI - GNU Parser
GNU解析器用于解析传递的gnu参数。 它现已弃用,并由DefaultParser取代。
例子 (Example)
CLITester.java
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
//Create GNU like options
Options gnuOptions = new Options();
gnuOptions.addOption("p", "print", false, "Print")
.addOption("g", "gui", false, "GUI")
.addOption("n", true, "Scale");
CommandLineParser gnuParser = new GnuParser();
CommandLine cmd = gnuParser.parse(gnuOptions, args);
if( cmd.hasOption("p") ) {
System.out.println("p option was used.");
}
if( cmd.hasOption("g") ) {
System.out.println("g option was used.");
}
if( cmd.hasOption("n") ) {
System.out.println("Value passed: " + cmd.getOptionValue("n"));
}
}
}
输出 (Output)
在传递-p -g -n 10作为选项时运行该文件并查看结果。
java CLITester -p -g -n 10
p option was used.
g option was used.
Value passed: 10
Apache Commons CLI - Usage Example
Apache Commons CLI提供HelpFormatter类来打印命令行参数的使用指南。 查看示例。
例子 (Example)
CLITester.java
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("p", "print", false, "Send print request to printer.")
.addOption("g", "gui", false, "Show GUI Application")
.addOption("n", true, "No. of copies to print");
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("CLITester", options);
}
}
输出 (Output)
运行该文件并查看结果。
java CLITester
usage: CLITester
-g,--gui Show GUI Application
-n <arg> No. of copies to print
-p,--print Send print request to printer.
Apache Commons CLI - Help Example
Apache Commons CLI提供HelpFormatter类来打印与命令行参数相关的帮助。 查看示例。
例子 (Example)
CLITester.java
import java.io.PrintWriter;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class CLITester {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("p", "print", false, "Send print request to printer.")
.addOption("g", "gui", false, "Show GUI Application")
.addOption("n", true, "No. of copies to print");
HelpFormatter formatter = new HelpFormatter();
final PrintWriter writer = new PrintWriter(System.out);
formatter.printUsage(writer,80,"CLITester", options);
writer.flush();
}
}
输出 (Output)
运行该文件并查看结果。
java CLITester
usage: CLITester [-g] [-n <arg>] [-p]