说明
让写的程序接口更具有通用性,需要指定一些命令行参数。
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 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>
|