如何parsingJava中的命令行参数?

在Java中parsing命令行参数的好方法是什么?

检查这些:

或者滚动你自己的:


例如,这是你如何使用commons-cli来parsing2个string参数:

 import org.apache.commons.cli.*; public class Main { public static void main(String[] args) throws Exception { Options options = new Options(); Option input = new Option("i", "input", true, "input file path"); input.setRequired(true); options.addOption(input); Option output = new Option("o", "output", true, "output file"); output.setRequired(true); options.addOption(output); CommandLineParser parser = new DefaultParser(); HelpFormatter formatter = new HelpFormatter(); CommandLine cmd; try { cmd = parser.parse(options, args); } catch (ParseException e) { System.out.println(e.getMessage()); formatter.printHelp("utility-name", options); System.exit(1); return; } String inputFilePath = cmd.getOptionValue("input"); String outputFilePath = cmd.getOptionValue("output"); System.out.println(inputFilePath); System.out.println(outputFilePath); } } 

来自命令行的用法:

 $> java -jar target/my-utility.jar -i asd Missing required option: o usage: utility-name -i,--input <arg> input file path -o,--output <arg> output file 

看看最近的JCommander 。

我创造了它。 我很高兴收到问题或function要求。

我一直在试图维护一个Java CLIparsing器的列表 。

  • 航空公司
    • 活动叉: https : //github.com/rvesse/airline
  • argparse4j
  • argparser
  • args4j
  • clajr
  • CLI-parsing器
  • CmdLn
  • 命令行
  • DocOpt.java
  • 海豚getopt
  • DPML CLI(Jakarta Commons CLI2 fork)
  • Matthias Laux博士
  • Jakarta Commons CLI
  • jargo
  • jargp
  • jargs
  • Java的getopt的
  • jbock
  • JCLAP
  • jcmdline
  • jcommander
  • jcommando
  • 珠宝(由我写的)
  • 简单的JOpt
  • 司法制度评估scheme
  • naturalcli
  • Object Mentor CLI文章(更多关于重构和TDD)
  • parsing-CMD
  • ritopt
  • 罗普
  • TE代码命令
  • picocli有ANSI彩色使用帮助和自动完成

我用JOpt,发现它很方便: http ://jopt-simple.sourceforge.net/

头版还提供了大约8个备选库的列表,检查出来,并select最适合您的需求。

有人指出我最近args4j这是基于注释。 我很喜欢!

看看Commons CLI项目,那里有很多好东西。

叶氏。

我想你正在寻找这样的东西: http : //commons.apache.org/cli

Apache Commons CLI库提供了一个用于处理命令行界面的API。

也许这些

  • picocli“一个强大的小命令行界面” 。 Picocli是一个用于Java的命令行参数parsing器库,带有ANSI彩色使用帮助和命令行补全。 嵌套的子命令,详细的用户手册和包含作为源以避免取决于picocli的jar的能力也值得注意。
  • 用于Java的JArgs命令行选项parsing套件 – 这个小小的项目为Java程序员的使用提供了一个方便,紧凑,预先打包和全面文档化的命令行选项parsing器套件。 最初提供了与GNU风格的“getopt”兼容的parsing。

  • ritopt,Java的最终选项parsing器 – 虽然已经提供了几个命令行选项标准,但ritopt遵循opt包中的约定。

如果您熟悉gnu getopt,有一个java端口: http : //www.urbanophile.com/arenn/hacking/download.htm 。 似乎有一些这样做的类: http : //docs.sun.com/source/816-5618-10/netscape/ldap/util/GetOpt.html,http : //xml.apache.org/xalan -j / apidocs /组织/阿帕奇/的Xalan / XSLTC / CMDLINE / getopt的/ GetOpt.html

你可能会发现这个不幸的meta-article作为一个跳跃点:

http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html

我写了另一个: http : //argparse4j.sourceforge.net/

Argparse4j是一个基于Python的argparse的Java命令行参数parsing器库。

这是谷歌的命令行parsing库作为Bazel项目的一部分开源。 我个人认为这是最好的,比apache cli要容易得多。

https://github.com/pcj/google-options

安装

巴泽尔

 maven_jar( name = "com_github_pcj_google_options", artifact = "com.github.pcj:google-options:jar:1.0.0", sha1 = "85d54fe6771e5ff0d54827b0a3315c3e12fdd0c7", ) 

摇篮

 dependencies { compile 'com.github.pcj:google-options:1.0.0' } 

Maven的

 <dependency> <groupId>com.github.pcj</groupId> <artifactId>google-options</artifactId> <version>1.0.0</version> </dependency> 

用法

创build一个扩展OptionsBase并定义@Option (s)的类。

 package example; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionsBase; import java.util.List; /** * Command-line options definition for example server. */ public class ServerOptions extends OptionsBase { @Option( name = "help", abbrev = 'h', help = "Prints usage info.", defaultValue = "true" ) public boolean help; @Option( name = "host", abbrev = 'o', help = "The server host.", category = "startup", defaultValue = "" ) public String host; @Option( name = "port", abbrev = 'p', help = "The server port.", category = "startup", defaultValue = "8080" ) public int port; @Option( name = "dir", abbrev = 'd', help = "Name of directory to serve static files.", category = "startup", allowMultiple = true, defaultValue = "" ) public List<String> dirs; } 

parsing参数并使用它们。

 package example; import com.google.devtools.common.options.OptionsParser; import java.util.Collections; public class Server { public static void main(String[] args) { OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class); parser.parseAndExitUponError(args); ServerOptions options = parser.getOptions(ServerOptions.class); if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) { printUsage(parser); return; } System.out.format("Starting server at %s:%d...\n", options.host, options.port); for (String dirname : options.dirs) { System.out.format("\\--> Serving static files at <%s>\n", dirname); } } private static void printUsage(OptionsParser parser) { System.out.println("Usage: java -jar server.jar OPTIONS"); System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(), OptionsParser.HelpVerbosity.LONG)); } } 

https://github.com/pcj/google-options

航空公司@ Github看起来不错。 基于注释并试图模拟git命令行结构。

我不推荐使用Apache Common CLI库,因为它是非线程安全的。 它使用具有静态variables和方法的有状态类来完成内部工作(例如OptionBuilder),并且只能用于单线程严格控制的情况。

买或build立?

许多小型的类似实用程序的应用程序可能会滚动自己的命令行parsing,以避免额外的外部依赖。

picocli可能会很有趣。 它的目的是作为一个更简单的替代scheme,将镜子放入uberjar中。

你可能会喜欢的另一个function是它的彩色使用帮助。

最少的使用帮助ANSI颜色

parsing器function:

  • 基于注解:parsing是一行代码
  • 强types的一切 – 命令行选项以及位置参数
  • POSIX集群短选项( <command> -xvfInputFile以及<command> -x -v -f InputFile
  • 允许最小,最大和可变数量的参数(例如"1..*""3..5"
  • 子命令(可以嵌套到任意深度)
  • 适用于Java 5及更高版本

使用帮助信息很容易通过注释进行定制(无需编程)。 例如:

扩展的使用帮助消息 ( 来源 )

我忍不住再添加一张屏幕截图来显示使用帮助信息是可能的。 使用帮助是你的应用程序的面貌,所以要有创意,玩得开心!

picocli演示

免责声明:我创build了picocli。 反馈或问题非常欢迎。

如果你想要一些轻量级(jar大小〜20 kb)并且使用简单,你可以尝试argument-parser 。 它可以在大多数用例中使用,支持在参数中指定数组,并且不依赖任何其他库。 它适用于Java 1.5或更高版本。 下面的摘录显示了如何使用它的一个例子:

 public static void main(String[] args) { String usage = "--day|-d day --mon|-m month [--year|-y year][--dir|-ds directoriesToSearch]"; ArgumentParser argParser = new ArgumentParser(usage, InputData.class); InputData inputData = (InputData) argParser.parse(args); showData(inputData); new StatsGenerator().generateStats(inputData); } 

更多的例子可以在这里find

Argparse4j是我find的最好的。 它模仿python argparse libary,这是非常方便和强大的。