命令行参数解析工具JCommander的文档

说明

让写的程序接口更具有通用性,需要指定一些命令行参数。
JCommander提供了很简单通用的解析功能

官网文档地址
http://jcommander.org/

github地址:
https://github.com/cbeust/jcommander

示例

主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import com.beust.jcommander.JCommander;

public class CmdMain {
public static void main(String[] args) {
String [] params = {"--help","file1","file2"};
CmdConfig cmdconfig = new CmdConfig();
JCommander jc= new JCommander(cmdconfig);
jc.parse(params);
jc.setProgramName(CmdMain.class.getSimpleName());
if(cmdconfig.help)
{
jc.usage();
System.out.println("---------------");
}
List<String> list = cmdconfig.inputPaths;
for (String string : list) {
System.out.println(string);
}
}
}

配置类

1
2
3
4
5
6
7
8
9
import com.beust.jcommander.Parameter;
public class CmdConfig {
@Parameter(names = "--help", description = "打印帮助信息")
boolean help;
@Parameter(names = "--fun", description = "指定处理函数")
String functionName;
@Parameter(description = "(input files)")
List<String> inputPaths;
}

把命令行参数解析到CmdConfig中了
运行结果:

1
2
3
4
5
6
7
8
9
10
11
Usage: CmdMain [options] (input files)
Options:
--fun
指定处理函数
--help
打印帮助信息
Default: false

---------------
file1
file2

扩展说明

注解@Parameter 有几个常用参数

  • name 接收一个列表,参数名称
  • description 描述
  • required 是否必须
  • arity 指定有多少个参数值,比如你需要传入四个坐标,就指定4
  • validateWith 参数验证器
  • order 指定顺序

同时支持自定义的转化器

参数分割符

默认的分割符为空格
若要支持如下

1
java Main -level=42

可以使用

1
2
3
4
5
@Parameters(separators = "=")
public class SeparatorEqual {
@Parameter(names = "-level")
private Integer level = 2;
}

这种方式

多种描述方式

支持多个配置类,进行同时解析

1
2
3
4
5
6
7
8
9
public class ArgsMaster {
@Parameter(names = "-master")
private String master;
}

public class ArgsSlave {
@Parameter(names = "-slave")
private String slave;
}
1
2
3
4
5
6
7
8
9
10
ArgsMaster m = new ArgsMaster();
ArgsSlave s = new ArgsSlave();
String[] argv = { "-master", "master", "-slave", "slave" };
JCommander.newBuilder()
.addObject(new Object[] { m , s })
.build()
.parse(argv);

Assert.assertEquals(m.master, "master");
Assert.assertEquals(s.slave, "slave");

@ 语法

JCommander 支持@语法,可以把你把参数放在文件中,然后用这个文件来解析参数,如下

/tmp/parameters

1
2
3
4
-verbose
file1
file2
file3
1
$ java Main @/tmp/parameters

参数的多个变量

这样固定类型的

1
2
@Parameter(names = "-pairs", arity = 2, description = "Pairs")
private List<String> pairs;

如果不输入两个,就会把错。

可变的类型

1
2
@Parameter(names = "-foo", variableArity = true)
public List<String> foo = new ArrayList<>();

可以有多个

可变类的,用类去接参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static class MvParameters {
@SubParameter(order = 0)
String from;

@SubParameter(order = 1)
String to;
}

@Test
public void arity() {
class Parameters {
@Parameter(names = {"--mv"}, arity = 2)
private MvParameters mvParameters;
}

Parameters args = new Parameters();
JCommander.newBuilder()
.addObject(args)
.args(new String[]{"--mv", "from", "to"})
.build();

Assert.assertNotNull(args.mvParameters);
Assert.assertEquals(args.mvParameters.from, "from");
Assert.assertEquals(args.mvParameters.to, "to");
}

多个选项名称

1
2
@Parameter(names = { "-d", "--outputDirectory" }, description = "Directory")
private String outputDirectory;

其它配置选项

  • 大小写敏感,JCommander#setCaseSensitiveOptions来指定
  • 缩写的支持(-par可以识别出-param),JCommander#setAllowAbbreviatedOptions(boolean),

动态参数

JCommander 支持如”-Da=b -Dc=d”这样的参数,可以如下使用

1
2
@DynamicParameter(names = "-D", description = "Dynamic parameters go here")
private Map<String, String> params = new HashMap<>();

maven 地址

1
2
3
4
5
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.71</version>
</dependency>

命令行参数解析工具JCommander的文档
https://blog.fengcl.com/2021/09/19/jcommander-use/
作者
frank
发布于
2021年9月19日
许可协议