如何在Java中将某些命令行参数解析为单个选项

问题描述

我了解如何直接和使用args4j使用选项解析命令行字符串。但是我找不到如何将多个参数解析为单个选项的方法。我的意思是这样的命令行:

java -jar myprog.jar -i firstFile secondFile thirdFile -o outputFile

所以基本上我想为输入选项传递未定义数量的参数。 谢谢。

解决方法

我认为

args4j无法做到这一点。我不会使用args4j,它已经过时了。

尝试jcommander。这是完全相同的想法,但是与args4j不同,您可以将jcommander放在@Option上使用List<T>。参见文档的2.2节(单击链接,转到2.2。:P)

但是:请注意,如果我从字面上理解您的问题,那么您的要求是非常不可取的!

在posix样式的命令行参数中,您的字符串被解析为:

  • -i firstFile-好的,firstFile是-i选项的参数。
  • secondFile-好的,这与-i完全无关,这是一个文件参数。
  • thirdFile-一样的交易。
  • -o outFile-outFile是-o开关的argvalue。

您大概想要的以及jcommander的工作方式是您必须编写:

java -jar myprog.jar -i firstFile -i secondFile -i thirdFile -o outFile

如果您真的希望-i firstFile secondFile thirdFile工作,那就有点奇怪/非标准了,自然地,当想要非标准的东西时,标准库不太可能为您提供服务,因此您必须用手写下来。我建议您..稍微改变一下想要的内容,使其与人们的期望保持一致,从而获得使用图书馆为您提供的好处。

但是,在命令行设计的这个难题中,-i in1 -i in2 -i in3会更好,但仍然是惯用且笨拙的。通常的规则是,输入是通过无开关输入的。编写命令行的正确方法是:

java -jar myprog.jar -o outFile firstFile secondFile thirdFile

zipcurlffmpegjava(可执行文件)本身的工作方式等等。

args4j和jcommander都可以做到这一点; args4j通过@Arguments List<String> args;,jcommander通过@Parameter

,

对于arg4j,如果要获取链接到“ i”选项的列表,则可以使用StringArrayOptionHandler

使用此命令行:

java -jar myprog.jar -i firstFile secondFile thirdFile -o outputFile

要做的源代码是:

class Main {

    @Option(name = "-i",handler = StringArrayOptionHandler.class)
    private List<String> files;

    @Option(name = "-o")
    private String outputFile;

    public static void main(String[] args) throws Exception {
        Main bean = new Main();
        CmdLineParser parser = new CmdLineParser(bean);
        parser.parseArgument(args);

        bean.files.stream().forEach(entry -> System.out.println(entry));
        System.out.println(bean.outputFile);
    }
}