Java命令行解析类库技术选型分析

虽然在Java领域中web程序应用广泛,但是基于Java开发命令行的工具也是非常使用的,本文将介绍一下在过去几天针对命令行工具Java类库的调研结果。

JCommander

项目地址: https://github.com/cbeust/jcommander
Star: 1010 Fork: 227
文档地址: http://jcommander.org/

使用示例:

public class JCommanderTest {
    @Parameter
    public List parameters = Lists.newArrayList();

    @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity")
    public Integer verbose = 1;

    @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
    public String groups;

    @Parameter(names = "-debug", description = "Debug mode")
    public boolean debug = false;

    @DynamicParameter(names = "-D", description = "Dynamic parameters go here")
    public Map dynamicParams = new HashMap();
}

评价: 文档齐备,非常完整和细致,基于注解来进行命令的设置,简单易用,基本满足了命令行工具的全部需求。

picocli

地址: https://github.com/remkop/picocli
Star: 336, Fork: 32
示例:https://github.com/kakawait/picocli-spring-boot-starter

import picocli.CommandLine;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;
import java.io.File;

public class Example implements Runnable {
    @Option(names = { "-v", "--verbose" }, description = "Verbose mode. Helpful for troubleshooting. " +
                                                         "Multiple -v options increase the verbosity.")
    private boolean[] verbose = new boolean[0];

    @Option(names = { "-h", "--help" }, usageHelp = true,
            description = "Displays this help message and quits.")
    private boolean helpRequested = false;

    @Parameters(arity = "1..*", paramLabel = "FILE", description = "File(s) to process.")
    private File[] inputFiles;

    public void run() {
        if (verbose.length > 0) {
            System.out.println(inputFiles.length + " files to process...");
        }
        if (verbose.length > 1) {
            for (File f : inputFiles) {
                System.out.println(f.getAbsolutePath());
            }
        }
    }

    public static void main(String[] args) {
        CommandLine.run(new Example(), System.out, args);
    }
}

这里内部支持Command的概念,支持subCommand的概念,

@Component
@Command(name = "greeting")
class GreetingCommand implements Runnable {

    @Parameters(paramLabel = "NAME", description = "name", arity = "0..1")
    String name;

    @Override
    public void run() {
        if (StringUtils.hasText(name)) {
            System.out.println("Hello " + name + "!");
        } else {
            System.out.println("Hello world!");
        }
    }
}

总结分析: 更新比较活跃,封装了很多的概念,比如Command,方便基于命令来调用不同的逻辑处理,基于注解来设置各类arg Option,满足日常的使用和操作。

Args4j

项目地址: https://0github.com/kohsuke/args4j
Star: 570 Fork: 151
文档地址: http://args4j.kohsuke.org/sample.html
活跃程度: 最后一次更新为2年之前

...
import org.kohsuke.args4j.Option;
...
@Option(name="-name",usage="Sets a name")
public String name;
...
@Option(name="-file",usage="Sets a file if that is present")
public void setFile(File f) {
...

支持注解来设置命令行参数,也支持基于在代码中设置参数,简单易用,但是从目前来看,更新已经停止了。

Commons CLI

地址: https://commons.apache.org/proper/commons-cli/
地址: 来自apache common的开源项目
更新: 最后一次更新是1.5-SNAPSHOT,是在2017年6月8日

总结分析: 更新迟缓,基于代码来配置和设置参数,目前最新版本是1.5,2.0在开发过程中,但是从未完成过。

总结

JCommander首选,文档和使用皆非常出色。 Picocli也是非常出色的,提供了丰富的功能,且支持Command的命令定义以及subcommand的方式,比较适合命令行的工具开发。

你可能感兴趣的:(Java技术)