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

如何在Java中解析命令行参数?,java,command-line,command-line-arguments,Java,Command Line,Command Line Arguments,在Java中解析命令行参数的好方法是什么?查看以下内容: 或者你自己滚: 例如,这是解析2个字符串参数的方法: import org.apache.commons.cli.*; public class Main { public static void main(String[] args) throws Exception { Options options = new Options(); Option input = ne

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

查看以下内容:

或者你自己滚:


例如,这是解析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,--input <arg>    input file path
 -o,--output <arg>   output file
$>java-jar目标/my-utility.jar-i asd
缺少必需的选项:o
用法:实用程序名称
-i、 --输入文件路径
-o、 --输出文件
看看这个项目,里面有很多好东西。

可能是这些

  • -这个小项目为Java程序员提供了一套方便、紧凑、预打包和全面文档化的命令行选项解析器。最初,提供了与GNU样式“getopt”兼容的解析

  • -尽管已经提出了一些命令行选项标准,但ritopt遵循opt包中规定的约定


我使用过JOpt,发现它非常方便:

首页还列出了大约8个可供选择的库,请查看它们并选择最适合您需要的库。

Yeap

我想你在找这样的东西:

Apache Commons CLI库提供了一个用于处理命令行接口的API


如果您熟悉gnu getopt,那么以下位置有一个Java端口:

在某些类中,似乎存在这样的问题:


最近有人指给我看,这是基于注释的。我真的很喜欢

看一看最近的


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

我一直在努力维护一个新的功能

    • 主动分叉:
  • 具有ANSI彩色使用帮助和自动完成功能
    • 我又写了一篇:


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

      看起来不错。它基于注释,并试图模拟Git命令行结构。

      这是Google的命令行解析库,作为Bazel项目的一部分开源。我个人认为它是最好的,而且比ApacheCli简单得多

      装置 巴泽尔 格拉德尔 专家 解析参数并使用它们

      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));
        }
      
      }
      
      包示例;
      导入com.google.devtools.common.options.options解析器;
      导入java.util.Collections;
      公共类服务器{
      公共静态void main(字符串[]args){
      OptionsParser=OptionsParser.newOptionsParser(ServerOptions.class);
      parser.parseAndExitUponError(args);
      ServerOptions=parser.getOptions(ServerOptions.class);
      if(options.host.isEmpty()| | options.port<0 | | | options.dirs.isEmpty()){
      打印使用(解析器);
      返回;
      }
      System.out.format(“在%s启动服务器:%d..\n”,options.host,options.port);
      for(字符串dirname:options.dirs){
      System.out.format(“\\-->在\n处提供静态文件”,dirname);
      }
      }
      私有静态void printUsage(OptionsParser){
      println(“用法:java-jarserver.jar选项”);
      System.out.println(parser.descripeboptions(Collections.emptyMap(),
      OptionsParser.HelpVerbosity.LONG);
      }
      }
      

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

      您应该构建自己的Java命令行解析器,还是使用库

      许多类似于实用程序的小型应用程序可能使用自己的命令行解析来避免额外的外部依赖。这可能是一个有趣的选择

      Picocli是一个现代化的库和框架,用于轻松构建功能强大、用户友好、支持GraalVM的命令行应用程序。它存在于1个源文件中,因此应用程序可以将其作为源文件包含,以避免添加依赖项

      它支持颜色、自动完成、子命令等。用Java编写,可从Groovy、Kotlin、Scala等处使用

      特点:

      • 基于注释:声明性避免重复表达程序员的意图
      • 方便:解析用户输入并使用一行代码运行业务逻辑
      • 强类型所有内容-命令行选项以及位置参数
      • POSIX集群短选项(
        -xvInputFile
        以及
        -x-v-f InputFile
      • 细粒度控制:一种允许最小、最大和可变数量参数的arity模型,例如,
        “1..*”
        “3..5”
      • 子命令(可以嵌套到任意深度)
      • 功能丰富:可组合的参数组、拆分带引号的参数、可重复的子命令等等
      • 用户友好:使用帮助消息使用颜色将选项名称等重要元素与其他使用帮助进行对比,以减少用户的认知负荷
      • 适用于Java 5及更高版本
      • 博大精深
      使用帮助消息很容易通过注释进行自定义(无需编程)。例如:

      ()

      我忍不住又添加了一个屏幕截图来显示帮助消息的用途。使用帮助是应用程序的外观,所以要有创意,玩得开心

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

      如果
      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>
      
      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));
        }
      
      }
      
      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);
      }
      
      Map<String, String> argsMap = new HashMap<>();
      for (String arg: args) {
          String[] parts = arg.split("=");
          argsMap.put(parts[0], parts[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/",
      )
      
      bazel run path/to/your:project -- --var1 something --var2 something -v something
      
      bazel run path/to/your:project -- --help
      
      @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
        }
      }
      
      @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);
        }
      
      }
      
      @Component
      public class MyBean {
      
         @Autowired
         private ApplicationArguments arguments;
      
         // ...
      }