焦点热门:使用 JCommander 解析命令行参数

2023-06-21 19:56:16 来源:程序员客栈

代码中使用 @Parameters注解指定了子命令为 commit,同时使用 @Paramete注解指定子参数 -m,同时 -m参数是必须的,使用属性 required = true来指定。

使用 GitCommandCommit:

使用 addCommand添加 Commit命令参数类。

GitCommandOptions gitCommandOptions = new GitCommandOptions();GitCommandCommit commandCommit = new GitCommandCommit();JCommander commander = JCommander.newBuilder()    .programName("git-app")    .addObject(gitCommandOptions)    .addCommand(commandCommit)    .build();commander.parse(args);String parsedCommand = commander.getParsedCommand();if ("commit".equals(parsedCommand)) {    System.out.println(commandCommit.getComment());}

运行测试:

$ java -jar git-app.jar commit -m "注释一下"注释一下

同上,我们可以添加 add命令对应的参数类:GitCommandAdd.java. 这次我们定义一个 List 类型参数,但是不在属性上指定子参数名称。

package com.wdbyte.jcommander.v5;import java.util.List;import com.beust.jcommander.Parameter;import com.beust.jcommander.Parameters;/** * git add file1 file2 * * @author https://www.wdbyte.com */@Parameters(commandDescription = "暂存文件", commandNames = "add", separators = " ")public class GitCommandAdd {    public static final String COMMAND = "add";    @Parameter(description = "暂存文件列表")    private Listfiles;    public ListgetFiles() {        return files;    }}

同样添加到子命令:

JCommander commander = JCommander.newBuilder()    .programName("git-app")    .addObject(gitCommandOptions)    .addCommand(commandCommit)    .addCommand(commandAdd)    .build();commander.parse(args);if ("add".equals(parsedCommand)) {    for (String file : commandAdd.getFiles()) {        System.out.println("暂存文件:" + file);    }}

运行测试:

$ java -jar git-app.jar add file1.txt file2.txt暂存文件:file1.txt暂存文件:file2.txt

jcommander 参数转换

在上面的 GitCommandAdd代码中,add命令传入的都是文件路径,现在是使用 List来接收入参,通常情况想我们可能需要直接转换成方便操作的类型,如 File 或者 Path,这该如何方面的转换呢,jcommander 也提供了方便转换类。

首先编写一个转换类 FilePathConverter 用于把入参转换成 Path 类,同时校验文件是否存在

package com.wdbyte.jcommander;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import com.beust.jcommander.IStringConverter;import com.beust.jcommander.ParameterException;/** * * @author https://www.wdbyte.com */public class FilePathConverter implements IStringConverter{    @Override    public Path convert(String filePath) {        Path path = Paths.get(filePath);        if (Files.exists(path)) {            return path;        }        throw new ParameterException(String.format("文件不存在,path:%s", filePath));    }}
关键词:
x 广告
x 广告

Copyright   2015-2022 财务报告网版权所有  备案号: 京ICP备12018864号-19   联系邮箱:29 13 23 6 @qq.com