虽然在Java领域中web程序应用广泛,但是基于Java开发命令行的工具也是非常使用的,本文将介绍一下在过去几天针对命令行工具Java类库的调研结果。
项目地址: 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();
}
评价: 文档齐备,非常完整和细致,基于注解来进行命令的设置,简单易用,基本满足了命令行工具的全部需求。
地址: 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,满足日常的使用和操作。
项目地址: 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) {
...
支持注解来设置命令行参数,也支持基于在代码中设置参数,简单易用,但是从目前来看,更新已经停止了。
地址: https://commons.apache.org/proper/commons-cli/
地址: 来自apache common的开源项目
更新: 最后一次更新是1.5-SNAPSHOT,是在2017年6月8日
总结分析: 更新迟缓,基于代码来配置和设置参数,目前最新版本是1.5,2.0在开发过程中,但是从未完成过。
JCommander首选,文档和使用皆非常出色。 Picocli也是非常出色的,提供了丰富的功能,且支持Command的命令定义以及subcommand的方式,比较适合命令行的工具开发。