parsing命令行参数的Java库?

我用Java编写了一个命令行应用程序。 这个应用程序应该使用参数和命令的组合,类似于svn

例子

 app url command1 app url command2 --parameter2 -x app url command1 --param-with-argument argument app --parameter url command1 app --no-url command2 app --help 

通缉

  • 存在一个易于使用的Java库
  • 支持这些命令行的parsing
  • (奖金)自动创build适当的帮助

我是Commons CLI的粉丝。

您可以将其设置为了解命令,标记(使用短名称和长名称),是否需要某些命令/开关,或者是否具有默认值。 它甚至具有打印出有用的帮助types消息的function。

使用scheme页面有一些如何使用它的很好的例子。

尝试args4j http : args4j

我更喜欢args4j到Commons CLI。 (我也用过)

args4j ,你不需要调用任何函数。 一切都为你而做! (通过reflection将参数设置为对象字段。)

这是一个相对最新的(截至2017年8月)回答你的问题的图书馆列表。

  • JArgs
  • Jakarta Commons CLI
  • TE-Code (它有一个命令行parsing库)
  • argparser
  • GNU getopt的Java端口
  • Args4J
  • 司法制度评估scheme
  • JOpt简单
  • CLAJR
  • CmdLn
  • JewelCli
  • JCommando
  • parsing-CMD
  • JCommander
  • picocli (2017)使用ANSI颜色和自动完成的帮助

如果您正在寻找build议,我build议JOpt简单或JewelCli。

JewelCLI是一个用于命令行parsing的Java库,可以生成干净的代码 。 它使用configuration了注解的代理接口为您的命令行参数dynamic构buildtypes安全的API。

示例参数接口Person.java

 import uk.co.flamingpenguin.jewel.cli.Option; public interface Person { @Option String getName(); @Option int getTimes(); } 

参数接口Hello.java一个示例用法:

 import static uk.co.flamingpenguin.jewel.cli.CliFactory.parseArguments; import uk.co.flamingpenguin.jewel.cli.ArgumentValidationException; public class Hello { public static void main(String [] args) { try { Person person = parseArguments(Person.class, args); for (int i = 0; i < person.getTimes(); i++) System.out.println("Hello " + person.getName()); } catch(ArgumentValidationException e) { System.err.println(e.getMessage()); } } } 

将上述文件的副本保存到一个目录中,并将JewelCLI 0.7.6 JAR下载到该目录中。

编译并运行在Linux / Mac OS X / Bash上的例子:

 javac -cp jewelcli-0.7.6.jar:. Person.java Hello.java java -cp jewelcli-0.7.6.jar:. Hello --name="John Doe" --times=3 

编译并运行Windows命令提示符下的示例:

 javac -cp jewelcli-0.7.6.jar;. Person.java Hello.java java -cp jewelcli-0.7.6.jar;. Hello --name="John Doe" --times=3 

运行该示例应该会产生以下输出:

 Hello John Doe Hello John Doe Hello John Doe 

为了完整起见,我们添加JCommander https://github.com/cbeust/jcommander

 public class JCommanderTest { @Parameter public List<String> 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; } 

和一个示例用法

 CommanderTest jct = new JCommanderTest(); String[] argv = { "-log", "2", "-groups", "unit", "a", "b", "c" }; new JCommander(jct, argv); Assert.assertEquals(jct.verbose.intValue(), 2); 

这也是值得一看的- 简单 。

它试图遵守POSIX getopt()和GNU getopt_long()的命令行选项语法。 它似乎有一些社区的牵引力,尤其是OpenJDK (和Minecraft!)的命令行parsinglib的select。

命令行是基于注释的,允许将参数(序列,嵌套,参数,types等)组合起来的复杂规则,并有相当的文档logging。

要使用它,添加

 <dependency> <groupId>com.github.jankroken</groupId> <artifactId>commandline</artifactId> <version>1.7.0</version> </dependency> 

你的pom,并宣布可用的选项如下:

 public class CommandOptions { private List<String> commands = null; private boolean parameter = false; private boolean url = true; private boolean help = false; @LooseArguments public void setCommands(List<String> commands) { this.commands = commands; } @LongSwitch("parameter") @Toggle(true) public void setParameter(boolean parameter) { this.parameter=parameter; } @LongSwitch("noURL") @Toggle(false) public void setUrl(boolean url) { this.url = url; } @longSwitch("help") @Toggle(true) public void setHelp(boolean help) { this.help = help; } // getters } 

然后才能真正parsing命令行呢

 public final static void main(String[] args) { try { CommandOptions options = CommandLineParser.parse(CommandOptions.class, args, OptionStyle.SIMPLE); // and then you can pass options to your application logic... } catch ... } } 

请注意,它尚未包含自动生成的帮助文本。 这是原型,但中止。 对于简单的情况,生成一个基本的帮助文本是很容易的,但是对于更复杂的configuration(比如“find”或“gcc”等应用程序的可用选项),结果将不会很好,而且您可能更希望自己控制布局。

JSAP看起来相当不错。

http://sourceforge.net/projects/jsap/

我正在使用空运进行一个我正在进行的项目,似乎工作得非常好:

https://github.com/airlift/airline

简单的Maven依赖关系,你需要添加:

 <dependency> <groupId>io.airlift</groupId> <artifactId>airline</artifactId> <version>0.6</version> </dependency> 

在此之后,它是基于注释,并有一个很好的显示帮助文本的方式。

如果有帮助,可以在这里看到一个例子:

https://github.com/mneedham/neo4j-web-importer/blob/master/src/main/java/org/neo4j/dataimport/Neo4jImporter.java