在Java中解析命令行参数的好方法是什么?
最近的一颗新星是picocli(ANSI颜色,命令行自动完成,注释和编程API等等).
还要检查这些(较旧):
http://commons.apache.org/cli/
http://www.martiansoftware.com/jsap/
或滚动你自己:
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
例如,这是你commons-cli
用来解析2个字符串参数的方法:
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); } 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,--inputinput file path -o,--output output file
看一下最近的JCommander.
我创造了它.我很高兴收到问题或功能要求.
我一直在尝试维护一个Java CLI解析器列表.
航空公司
Active Fork:https://github.com/rvesse/airline
argparse4j
argparser
args4j
clajr
CLI-解析器
CmdLn
命令行
DocOpt.java
dolphin getopt
DPML CLI(Jakarta Commons CLI2 fork)
Matthias Laux博士
Jakarta Commons CLI
jargo
jargp
jargs
Java的getopt的
jbock
JCLAP
jcmdline
jcommander
jcommando
jewelcli(由我写)
简单
司法制度评估方案
naturalcli
Object Mentor CLI文章(有关重构和TDD的更多信息)
解析-CMD
ritopt
罗普
TE-Code命令
picocli具有ANSI彩色使用帮助和自动完成功能
我使用过JOpt,发现它非常方便:http://jopt-simple.sourceforge.net/
首页还提供了大约8个替代库的列表,检查出来并选择最适合您需求的库.
最近有人向我指出args4j是基于注释的.我很喜欢!
购买还是建造?
许多类似实用程序的小应用程序可能会使用自己的命令行解析来避免额外的外部依赖.
picocli可能很有趣.它被设计为作为源的一个更简单的替代方法,将阴影罐放入uberjar中.
您可能喜欢的另一个功能是它的彩色使用帮助.
解析器功能:
基于注释:解析是一行代码
强力输入所有内容 - 命令行选项以及位置参数
POSIX集群短期权(
以及
)
允许最小,最大和可变数量参数的arity模型,例如"1..*"
,"3..5"
子命令(可以嵌套到任意深度)
适用于Java 5及更高版本
使用帮助消息很容易使用注释进行自定义(无需编程).例如:
(来源)
我无法抗拒添加一个屏幕截图来显示可能的用法帮助消息.使用帮助是您的应用程序的面貌,所以要有创意,玩得开心!
免责声明:我创建了picocli.反馈或问题非常欢迎.
这是Google的命令行解析库,作为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' }
用法com.github.pcj google-options 1.0.0
创建一个扩展OptionsBase
和定义您的类的类@Option
.
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 Listdirs; }
解析参数并使用它们.
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.emptyMap(), OptionsParser.HelpVerbosity.LONG)); } }
https://github.com/pcj/google-options
看看Commons CLI项目,那里有很多好东西.
叶氏.
我想你正在寻找这样的东西:http: //commons.apache.org/cli
Apache Commons CLI库提供用于处理命令行界面的API.
也许这些
picocli"一个强大的微型命令行界面".Picocli是Java的命令行参数解析器库 - 具有ANSI着色的使用帮助和命令行完成.嵌套的子命令,详细的用户手册以及作为源代码的能力,以避免依赖于picocli的jar也是值得注意的.
用于Java的JArgs命令行选项解析套件 - 这个小项目提供了一个方便,紧凑,预打包和全面记录的命令行选项解析器套件,供Java程序员使用.最初,提供了与GNU风格的'getopt'兼容的解析.
ritopt,Java的终极选项解析器 - 虽然已经提出了几个命令行选项标准,但ritopt遵循opt包中规定的约定.
你可能会发现这篇不幸的元文章作为一个有趣的起点:
http://furiouspurpose.blogspot.com/2008/07/command-line-parsing-libraries-for-java.html
如果您熟悉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/org/apache/xalan/xsltc/cmdline/getopt/GetOpt.html
我又写了一篇:http://argparse4j.sourceforge.net/
Argparse4j是Java的命令行参数解析器库,基于Python的argparse.