【问题标题】:apache.commons.cli and "long" command-line parameters in JavaJava 中的 apache.commons.cli 和“长”命令行参数
【发布时间】:2016-11-06 19:06:38
【问题描述】:

是否可以在 java 中通过 apache.commons.cli.CommandLineParser 对命令行选项使用“长”参数? 'Long' 我的意思不是一个单词,而是块引号 ('"') 中的一个句子。Java 应用程序正在从 bash-script 文件启动。

脚本文件:

#!/bin/bash
java -cp <classpath> MyClass $@

调用(对于“-p”参数仅返回“long”,对于“-r”参数返回“another”):

./script.sh -p "long parameter" -r "another long parameter"

现在我只能做这样的事情来获取“长参数”字符串:

./script.sh -p "long" -p "parameter"

当然,我可以根据需要多次以编程方式添加“-p”,但这会阻止我在参数值中使用“-”符号,因为我需要跟踪其他命令行开关。此外,这似乎远不是正确的方法。

命令行选项是这样创建的:

org.apache.commons.cli.Options options = new Options();
options.addOption(Option.builder("p").longOpt("param").hasArg().desc("parameter description").build());

然后这样解析:

CommandLineParser parser = new DefaultParser();
CommandLine         line = parser.parse( options, args );
if (line.hasOption('p')) params = line.getOptionValues("param");

【问题讨论】:

  • longOpt 指的是选项的name,而不是选项值的长度。是否将长字符串传递给您的代码取决于所涉及的 shell。您使用的是什么操作系统和外壳?
  • 我在 MacOSX 上的 Bash shell 中这样做
  • 您使用的是哪个 shell,它是否使用双引号将字符串括起来?
  • 我使用 bash 并且对于参数值,我使用双引号将字符串括起来(正如我在问题中所写的那样),字面意思是:# java ClassName -p "value1 value2 value3"
  • 如果您想查看 CLI 接收的内容,只需执行 System.out.println(args); 其中 args 是您的 main 方法的参数。这将告诉您 shell 是否正确传递了引用的字符串。将输出添加到您的问题中。

标签: java bash command-line-arguments


【解决方案1】:

最后很清楚(感谢 Jim Garrison)问题是由从 bash-script 调用 java 类引起的(使用 $@ 传递所有参数)。将 $@ 包装到脚本中的双引号中解决了这个问题。像这样:

#!/bin/bash
java -cp <path> MyClass "$@"

而不是不正确

#!/bin/bash
java -cp <path> MyClass $@

【讨论】:

    猜你喜欢
    • 2014-08-02
    • 2012-10-04
    • 2013-04-09
    • 2017-03-04
    • 2010-10-17
    • 2016-03-25
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多