目录
一、引入依赖
二、方法实战
三、方法讲解
本文我们介绍一个命令行工具,Apache Commons CLI。
在我们执行java的jar包时,常用的命令是
java -jar hellowork.jar
# 或者
nohup java -jar hellowork.jar >>/data/log.txt2>&1 &
我们还可以在执行该命令时添加执行参数,不管是在dos还是Linux上执行该命令,抑或是在IDE工具中配置,都是一样的。
Java的命令行参数有很多,本文不做介绍,感兴趣的小伙伴可以自行百度:Java命令行参数。
一、引入依赖
本文的重点在于介绍,自定义Java命令行参数以及如何使用。
首先引入依赖:
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.5.0</version>
</dependency>
目前最新版是1.5.0,至于其他版本可以在maven仓库检索:
https://mvnrepository.com/artifact/commons-cli/commons-cli
引入依赖下载好之后便可以操作了。
二、方法实战
但是在操作之前,我们需要介绍一下这个 commons-cli。
commons-cli其实就是Apache Commons CLI,是Apache下的解析命令行的工具包。具体的可以自行百度。
有4个重载方法,我们使用第二个和第三个,也就是有2个参数和3个参数的方法。
最终的代码如下:
package com.dake.main;
import org.apache.commons.cli.*;
public class CommandLineMain {
public static void main(String[] args) throws ParseException {
Options options = new Options();
options.addOption("v", true, "version");
options.addOption("e", true, "env");
options.addOption("h", "help");
CommandLineParser commandLineParser = new DefaultParser();
CommandLine commandLine = commandLineParser.parse(options, args);
if (commandLine.hasOption("h")) {
System.out.println("这是帮助参数");
} else if (commandLine.hasOption("v")) {
String version = commandLine.getOptionValue("v");
System.out.println("版本号为" + version);
} else if (commandLine.hasOption("e")) {
String env = commandLine.getOptionValue("e");
System.out.println("环境为" + env);
}
}
}
我们使用idea自带的工具进行测试。
我们在启动的命令行CLI中添加-h参数。
保存并运行main方法。
修改h参数改为-e参数。
-v参数我们就不进行演示了。
三、方法讲解
下面我们看看这个addOption方法。
首先看最长的参数的方法,因为其他方法都是基于这个方法的。
/**
* Add an option that contains a short-name and a long-name.
*
* <p>
* It may be specified as requiring an argument.
* </p>
*
* @param opt Short single-character name of the option.
* @param longOpt Long multi-character name of the option.
* @param hasArg flag signalling if an argument is required after this option
* @param description Self-documenting description
* @return the resulting Options instance
*/
public Options addOption(final String opt, final String longOpt, final boolean hasArg, final String description) {
addOption(new Option(opt, longOpt, hasArg, description));
return this;
}
首先我们看注释,翻译过来就是:
添加一个包含短名称和长名称的选项。它可以被指定为需要一个参数。
形参:
opt–选项的短单字符名称。
longOpt–选项的长多字符名称。
hasArg–如果标志位true,则需要有参数,否则没有。
description-描述信息。
返回值:
生成的Options实例
简单来说,这4个参数都是命令的一些信息,分别是:
- 单字符描述,比如e/v等。
- 长命令,比如version、env等。
- 是否具有参数,也就是说该命令是否有取值,比如我们上面演示的-h后面没有跟参数,而-e命令后面则跟了参数取值为env。
- 描述信息,也就是该命令的具体含义。
一些文章中将第三个参数hasArg说成该命令否必须的取值,这是不对的。如果是这个意思,那么我们只需要把该参数设置成true,但是我们不输入-v或者-e,然后代码会报错才对。但是我们刚才的代码,不管是e还是v的第三个参数都是true,但是我们测试h和e的时候代码并没有报错。
实际上第三个参数的意思是说,该命令(指的是-e或-v)的参数取值,也就是它们后面是否跟的有参数取值,如果是true,但是我们不跟参数就会报错。
此时-v后面什么都没有,我们保存并运行代码。
报错了,意思是:
缺少选项v的参数
如果我们把true改成false再运行。
但是我们在获取该命令的取值时为null。
这也验证了我们所说的意思。
总结:
hasArg是一个用来校验命令后是否有参数取值的布尔值,true代表必须跟取值,false代表非必须。
上面我们使用了三个参数的方法,其实这是把长命令置为了null而已。
而2个参数的方法是把长命令置为了null,并且是否具有参数置为了false。
1个参数的方法传入的是一个Option,可以自己创建这个Option,然后传递给这个方法。
当然,这个命令行工具还有其他方法,这里就不具体讲述了,感兴趣的小伙伴可以自行参详。