如何解决如何在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
zip
,curl
,ffmpeg
,java
(可执行文件)本身的工作方式等等。
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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。