【问题标题】:Getting Java Runtime Arguments --argumentName=argumentValue获取 Java 运行时参数 --argumentName=argumentValue
【发布时间】:2018-09-15 14:34:25
【问题描述】:

我需要运行一个程序,其中运行时参数以表单形式传递,

--argumentName=argumentVaue

我需要在如下所示的主函数中获取这些值,

public class TestArguments {

  public static void main(String[] args) {

    System.out.println(System.getProperty("argumentA"));
    System.out.println(System.getProperty("argumentB"));
    System.out.println(System.getProperty("argumentC"));
    System.out.println(System.getProperty("argumentD"));

    for(int i=0; i<args.length; i++) {
        System.out.println("Argument " + i + " equals " + args[i]);
    }

  }

}

当我检查args 中的值时,我只得到一个大字符串,例如--argumentA=foo。我可以做一个 string.split("=") 将名称与值分开,但这似乎不是一种通过名称获取参数值的优雅方式。我认为System.getProperty("argumentName") 可以解决问题,但值始终是null。我正在通过像 java -cp "myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d 这样的 jar 运行我的程序。

【问题讨论】:

标签: java arguments command-line-arguments


【解决方案1】:

您也可以使用Apache Commons CLI,这是一个非常好的命令行解析库。

您可以在 Maven 或 Gradle 项目中使用它。

在 Gradle 项目中,您需要将其插入到依赖项中:

compile group: 'commons-cli', name: 'commons-cli', version: '1.4'

以下是如何在 Apache Commons CLI 中实现此参数 (--argumentName=argumentValue) 的示例:

import org.apache.commons.cli.*;

public class CLITestMain {

    public static void main(String[] args) throws ParseException {
        // create Options object
        Options options = new Options();

        // add a option
        options.addOption("a", "argumentName", true, "Do something");
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd = parser.parse( options, args);

        if(cmd.hasOption("a")) {
            System.out.println("You nailed it!");
            System.out.println(cmd.getOptionValue("a"));
        }
        else {
            HelpFormatter formatter = new HelpFormatter();
            formatter.printHelp( "CLITestMain", options );
        }
    }
}

此示例支持参数的短格式和开箱即用的长格式。

长格式:

java CLITestMain --argumentName=hi

短格式:

java CLITestMain -a=hi

【讨论】:

  • 我个人认为 Apache Commons CLI(我使用过但未用于新应用程序)不如 Args4J 实用。 API 实在是太麻烦了。
  • @Mr.Tea 如果用户没有正确输入参数,您实际上可以使用HelpFormatter 自动生成帮助信息。见上面的例子。
  • @gil.fernandes HelpFormatter 很不错,刚刚添加,谢谢。
【解决方案2】:

实际上,您传递程序参数是在课程开始之后传递它们:

"java -cp myProgram.jar" com.foo.bar.TestArguments --argumentA=a --argumentB=b --argumentC=c--argumentD=d.

System.getProperty(String) 方法允许检索系统属性,这是另一回事。这就是您不使用此方法检索程序参数的原因。

System 属性是系统(操作系统)的属性。
您可以通过将它们作为 JVM 参数(而不是程序参数)传递/创建额外的它们,并在您的程序中更轻松地检索它们:

java -DargumentA=a -DargumentB=b -DargumentC=c -DargumentD=d -cp 
    "myProgram.jar" com.foo.bar.TestArguments 

但是,绕过系统属性以简化程序特定参数的检索是相当误导的。

因此,请保留您的程序参数,而不是拆分 String 参数,而是使用 API 来执行此操作。
Arg4J 可以很好地实现它。

这很简单:

import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.kohsuke.args4j.OptionHandlerFilter;

public class TestArguments {

    @Option(name = "--argumentA", usage = "...")
    private String argumentA;

    @Option(name = "--argumentB", usage = "...")
    private String argumentB;

    @Option(name = "--argumentC", usage = "...")
    private String argumentC;

    @Option(name = "--argumentD", usage = "...")
    private String argumentD;

    public static void main(String[] args) throws IOException {
       new TestArguments().doMain(args);
       // run the logic of the program
    }

    public void doMain(String[] args) throws IOException {
      CmdLineParser parser = new CmdLineParser(this);

      try {
        // parse the arguments.
        parser.parseArgument(args);        
       } catch (CmdLineException e) {
         System.err.println(e.getMessage());
         parser.printUsage(System.err);
         return;
       }     
    }
}

【讨论】:

  • 你的回答也很好,抱歉我只能接受一个答案,我选择了 Apache Commons CLI。注释虽然很好。谢谢。
  • @Mr.茶不客气。不用担心,这不是问题:) 正如答案的评论中所说,我个人认为 Apache Commons CLI(我使用过但未用于新应用程序)不如 Args4J 实用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2017-11-03
  • 1970-01-01
相关资源
最近更新 更多