如何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)); } }
航空公司@ Github看起来不错。 基于注释并试图模拟git命令行结构。
我不推荐使用Apache Common CLI库,因为它是非线程安全的。 它使用具有静态variables和方法的有状态类来完成内部工作(例如OptionBuilder),并且只能用于单线程严格控制的情况。
买或build立?
许多小型的类似实用程序的应用程序可能会滚动自己的命令行parsing,以避免额外的外部依赖。
picocli可能会很有趣。 它的目的是作为一个更简单的替代scheme,将镜子放入uberjar中。
你可能会喜欢的另一个function是它的彩色使用帮助。
parsing器function:
- 基于注解:parsing是一行代码
- 强types的一切 – 命令行选项以及位置参数
- POSIX集群短选项(
<command> -xvfInputFile
以及<command> -x -v -f InputFile
) - 允许最小,最大和可变数量的参数(例如
"1..*"
,"3..5"
- 子命令(可以嵌套到任意深度)
- 适用于Java 5及更高版本
使用帮助信息很容易通过注释进行定制(无需编程)。 例如:
( 来源 )
我忍不住再添加一张屏幕截图来显示使用帮助信息是可能的。 使用帮助是你的应用程序的面貌,所以要有创意,玩得开心!
免责声明:我创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,这是非常方便和强大的。