在Java中如何解析命令行参数?

683

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


17
请注意,CLI库不是线程安全的。然而,我会假设在应用程序启动期间,通常会在单个线程中完成命令行解析,然后根据参数启动其他线程。 - Alexey Ivanov
6
请参考args4j和详细示例以了解如何使用它:http://martin-thoma.com/how-to-parse-command-line-arguments-in-java/ - Martin Thoma
@RedGlyph - 看起来SO/SE需要简化他们的规则。问题应该是:“如何解析Java命令行参数?”但是没有人真正想编写代码来做这件事,而是想使用工具。但是搜索工具等并不是建设性的 :( - AlikElzin-kilaka
14
投了重新开放的一票。@AlikElzin:确实,他们需要审查他们的管理过程。我怀疑关闭问题会获取一个徽章,并且这个徽章会吸引那些想当管理员但过于热衷的人。 - RedGlyph
9
这个问题是用来诱捕坏的/单行回答和工具推荐的,它应该保持关闭状态。 - JAL
显示剩余3条评论
21个回答

8
如果你已经在使用Spring Boot,参数解析就已经内置好了。
如果你想在启动后运行一些操作,可以实现ApplicationRunner接口:
@SpringBootApplication
public class Application implements ApplicationRunner {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(ApplicationArguments args) {
    args.containsOption("my-flag-option"); // test if --my-flag-option was set
    args.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 {

   @Autowired
   private ApplicationArguments arguments;

   // ...
}

这太棒了 :)。 - John Humphreys

7
也许这些可以帮到你:
  • JArgs Java命令行选项解析套件 - 这个小项目为Java程序员提供了一个方便、紧凑、预打包和全面文档化的命令行选项解析器套件。最初,提供了与GNU-style 'getopt'兼容的解析方式。

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


6

欢迎来到Stack Overflow!感谢您发布答案!请务必仔细阅读关于自我推广的常见问题解答 - Andrew Barber


4

3
我想向你展示我的实现:ReadyCLI 优点:
  • 适用于懒惰的程序员:只需要学习非常少的类,查看存储库中 README 中的两个简单示例就可以掌握 90% 的知识;不需要其他任何知识,就可以开始编写你的 CLI/Parser; ReadyCLI 让编写 CLI 变得更加自然;
  • 设计时考虑到了 开发人员体验;它大量使用构建器模式和 Lambda 表达式的函数接口,以允许快速编码;
  • 支持 选项标志子命令
  • 允许从命令行解析参数,并构建更复杂和交互式的 CLI;
  • 可以在标准 I/O 上启动 CLI,就像在任何其他 I/O 接口(如套接字)上一样方便;
  • 为命令文档提供了极佳的支持。
我开发这个项目是因为我需要新功能(选项、标志、子命令),并且可以在我的项目中以最简单的方式使用。

3

Argparse4j 是我发现的最好的工具。它模仿了 Python 的 argparse 库,非常方便和强大。


2

如果你想要一个轻量级(jar大小约为20KB)且易于使用的东西,可以尝试使用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);
}

More examples can be found here


1
链接已失效。你放弃了这个项目吗? :-( - beldaz

0
作为早先提到的评论之一(https://github.com/pcj/google-options),这将是一个不错的起点。
我想要补充的一件事是:
1) 如果你遇到一些解析器反射错误,请尝试使用更新版本的guava。在我的情况下:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接