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


#1楼

我不建议使用Apache Common CLI库,因为它是非线程安全的。 它使用带有静态变量和方法的有状态类来进行内部工作(例如OptionBuilder),并且仅应在单线程严格控制的情况下使用。


#2楼

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

Argparse4j是基于Python的argparse的Java命令行参数解析器库。


#3楼

@ Github的航空公司看起来不错。 它基于注释,正在尝试模拟Git命令行结构。


#4楼

看一下最近的JCommander 。

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


#5楼

检查这些:

  • 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: ousage: utility-name-i,--input <arg>    input file path-o,--output <arg>   output file

#6楼

看一下Commons CLI项目,那里有很多不错的东西。


#7楼

也许这些

  • 适用于Java的JArgs命令行选项解析套件 -这个小项目为Java程序员提供了一个方便,紧凑,预先打包且文档全面的命令行选项解析器套件。 最初,提供了与GNU风格的“ getopt”兼容的解析。

  • ritopt,Java的终极选项分析器 -尽管已经提出了几种命令行选项标准,但ritopt遵循opt软件包中规定的约定。


#8楼

我使用过JOpt并发现它非常方便: http ://jopt-simple.sourceforge.net/

主页还提供了大约8个替代库的列表,将其检出并选择最适合您需要的一个。


#9楼

是的

我认为您正在寻找这样的东西: http : //commons.apache.org/cli

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


#10楼

如果您熟悉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

#11楼

您可能会发现这不愉快的元文章很有趣,可以作为起点:

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


#12楼

最近有人将我指向基于注释的args4j 。 我很喜欢!


#13楼

这是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'
}

马文

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

用法

创建一个扩展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 List<String> dirs;}

解析参数并使用它们。

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


#14楼

现在是2019年,是时候比Commons CLI做得更好了... :-)

购买还是建造?

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

picocli可能很有趣。 它被设计为作为源提供,作为将jar着色到ub​​erjar中的一种更简单的替代方法。

您可能喜欢的另一个功能是其彩色使用帮助。

解析器功能:

  • 基于注释:解析是一行代码
  • 严格键入所有内容-命令行选项以及位置参数
  • POSIX集群短选项( <command> -xvfInputFile以及<command> -x -v -f InputFile
  • 允许最小,最大和可变数量参数的Arity模型,例如"1..*""3..5"
  • 子命令(可以嵌套到任意深度)
  • 适用于Java 5及更高版本

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

( 来源 )

我忍不住要再添加一个屏幕截图,以显示可能的使用帮助消息。 使用帮助是您应用程序的面目,因此请发挥创造力并尽情玩乐!

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


#15楼

如果您想要轻量级的东西(罐子大小〜20 kb)并且易于使用,则可以尝试arguments-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);
}

可以在这里找到更多示例


#16楼

我发现Argparse4j是最好的。 它模仿Python的argparse库,该库非常方便且强大。


#17楼

我知道这里的大多数人会发现一千万个为什么他们不喜欢我的方式但没关系的原因。 我喜欢使事情保持简单,因此我只是使用'='将键与值分开,并将它们存储在HashMap中,如下所示:

Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {String[] parts = arg.split("=");argsMap.put(parts[0], parts[1]);
}

您始终可以维护一个包含期望参数的列表,以在用户忘记参数或使用错误参数时为用户提供帮助。但是,如果您想要太多功能,则无论如何该解决方案都不适合您。


#18楼

正如前面提到的评论之一( https://github.com/pcj/google-options )是一个不错的选择。

我想添加的一件事是:

1)如果遇到解析器反射错误,请尝试使用较新版本的番石榴。 就我而言:

maven_jar(name = "com_google_guava_guava",artifact = "com.google.guava:guava:19.0",server = "maven2_server",
)maven_jar(name = "com_github_pcj_google_options",artifact = "com.github.pcj:google-options:jar:1.0.0",server = "maven2_server",
)maven_server(name = "maven2_server",url = "http://central.maven.org/maven2/",
)

2)运行命令行时:

bazel run path/to/your:project -- --var1 something --var2 something -v something

3)当需要使用帮助时,只需键入:

bazel run path/to/your:project -- --help

#19楼

对于Spring用户,我们还应该提到https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/SimpleCommandLinePropertySource.html和他的双胞胎兄弟https://docs.spring .io / spring / docs / current / javadoc-api / org / springframework / core / env / JOptCommandLinePropertySource.html (具有相同功能的JOpt实现)。 Spring的优势在于您可以将命令行参数直接绑定到属性,这里有一个示例https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/ CommandLinePropertySource.html


#20楼

如果您已经在使用Spring Boot,则可以直接进行参数解析。

如果要在启动后运行某些程序,请实现ApplicationRunner接口:

@SpringBootApplication
public class Application implements ApplicationRunner {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Overridepublic void run(ApplicationArguments args) {args.containsOption("my-flag-option"); // test if --my-flag-option was setargs.getOptionValues("my-option");     // returns values of --my-option=value1 --my-option=value2 args.getOptionNames();                 // returns a list of all available options// do something with your args}
}

上下文成功启动后,将调用您的run方法。

如果启动应用程序上下文之前需要访问参数,则可以简单地手动解析应用程序参数:

@SpringBootApplication
public class Application implements ApplicationRunner {public static void main(String[] args) {ApplicationArguments arguments = new DefaultApplicationArguments(args);// do whatever you like with your arguments// see above ...SpringApplication.run(Application.class, args);}}

最后,如果需要访问Bean中的参数,只需注入ApplicationArguments

@Component
public class MyBean {@Autowiredprivate ApplicationArguments arguments;// ...
}

#21楼

我一直在尝试维护Java CLI解析器的列表 。

  • 航空公司

    • 主动叉: https : //github.com/rvesse/airline
  • argparse4j
  • argparser
  • args4j
  • 克拉拉
  • 解析器
  • CmdLn
  • 命令行
  • DocOpt.java
  • 海豚getopt
  • DPML CLI(Jakarta Commons CLI2分支)
  • Matthias Laux博士
  • 雅加达公共CLI
  • 雅高
  • 贾格普
  • 罐子
  • java-getopt
  • 杰博克
  • 联合会
  • jcmdline
  • 指挥官
  • jcommando
  • jewelcli(我写的)
  • JOpt简单
  • jsap
  • Naturalcli
  • Object Mentor CLI文章(有关重构和TDD的更多信息)
  • 解析cmd
  • 立宝
  • p
  • TE代码命令
  • picocli具有ANSI彩色使用帮助和自动完成功能

如何在Java中解析命令行参数?相关推荐

  1. java 命令行 解析_如何在Java中解析命令行参数?

    小编典典 例如,这是你commons-cli用来解析2个字符串参数的方法: import org.apache.commons.cli.*; public class Main { public st ...

  2. java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  3. 在C#中解析命令行参数的最佳方法? [关闭]

    构建带有参数的控制台应用程序时,可以使用传递给Main(string[] args) . 过去,我只是索引/循环该数组,并做了一些正则表达式来提取值. 但是,当命令变得更复杂时,解析可能会变得很丑陋. ...

  4. linux 中解析命令行参数 (getopt_long用法)

    getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下:   #include <getopt.h>        int getopt_long ...

  5. python中访问命令行参数_如何在Python中访问命令行参数?

    我强烈建议argparsePython 2.7及更高版本随附. 该argparse模块减少了样板代码,并使您的代码更健壮,因为该模块可以处理所有标准用例(包括子命令),为您生成帮助和用法,检查和清理用 ...

  6. java 接收命令行参数_java中的命令行参数_Java中的命令行参数

    java中的命令行参数 Command-line arguments in Java are used to pass arguments to the main program. If you lo ...

  7. [转载] c语言中检查命令行参数_C中的命令行参数

    参考链接: Java中的命令行参数 c语言中检查命令行参数 Command line argument is a parameter supplied to the program when it i ...

  8. C语言中使用库函数解析命令行参数

    在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...

  9. Python 中的解析命令行参数

    argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生 ...

最新文章

  1. 汽车中的ECU, VCU, MCU, HCU
  2. 刘教授的Linux操作系统考试复习题
  3. hadoop yarn 获取日志_赵丽颖固然漂亮,可这份Hadoop核心教程也不差啊!
  4. 计蒜客 - Distance on the tree(LCA+主席树)
  5. SpringBoot邮件服务
  6. MySQL 8.0 表空间机制
  7. 【优化算法】龙格-库塔优化算法【含Matlab源码 1799期】
  8. 友图自动排料软件使用简介
  9. mysql的驱动jar包_各版本MySQL数据库驱动程序jar包大全(java连接mysql驱动jar包)
  10. 网上订餐系统的设计与实现(论文+源码)_kaic
  11. 内推 | 这可能是2019年最难得的机会之一啦~
  12. HDU 6638 Snowy Smile 线段树+最大子段和
  13. RSF 分布式服务框架-服务端工作原理
  14. 必备装机软件,软件推荐
  15. python getsize函数_Python getsizeof()和getsize()区分详解
  16. 从零开始的异界生活(偏了)从零开始搭建lamp服务ECShop,简单快速
  17. CSK会议通话降噪解决方案,以A.I.横扫噪音
  18. 做好人岗匹配,实现业绩增长
  19. 首发!小牛电动股权巨震:李一男、胡依林大幅减持,纪源资本退出
  20. Ethernet(以太网) 物理介质(10Base、100Base-T、100Base-TX等)

热门文章

  1. 追根究底之追本溯源:光标
  2. virtualbox 安装ubuntu 时,看不到继续、退出按钮?共享文件无权限?
  3. 一个例子看懂kotlin的集合和序列
  4. hibernate配置相关知识
  5. Can't call rollback when autocommit=true
  6. JavaScript语言基础12
  7. (004)RN开发VSCode调试ReactNative项目
  8. webpack预览页面配置
  9. 7.26T1四分图匹配
  10. Eclipse创建一个普通maven项目详细步骤