如何将某些命令行参数解析为 Java 中的单个选项
How to parse some of the command line arguments to a single option in Java
我了解如何直接解析命令行字符串以及使用 args4j 的选项。但我找不到如何将多个参数解析为单个选项。我的意思是这样的命令行:
java -jar myprog.jar -i firstFile secondFile thirdFile -o outputFile
所以基本上我想为输入选项传递未定义数量的参数。
谢谢
args4j 不能那样做,我想。我不会使用 args4j,它已经过时了。
尝试jcommander。这是完全相同的想法,但与 args4j 不同的是,您可以将 jcommander take on @Option
粘贴到 List<T>
上。请参阅文档的第 2.2 节(单击 link,转到 2.2。:P)
然而:请注意,如果我从字面上理解你的问题,那么你的问题是非常不可取的!
在 posix-style 命令行参数中,您的字符串被解析为:
-i firstFile
- 好的,firstFile 是 -i 选项的参数。
secondFile
- 好的,这与 -i 完全无关,这是一个文件参数。
thirdFile
- 同样的交易。
-o outFile
- outFile 是 -o 开关的参数值。
您可能想要的以及 jcommander 的工作方式是您必须编写:
java -jar myprog.jar -i firstFile -i secondFile -i thirdFile -o outFile
如果你真的想让 -i firstFile secondFile thirdFile
工作,那有点奇怪 / non-standard,自然地,当你想要非标准的东西时,标准库不太可能为你提供,所以你必须全部手写。我建议你.. 稍微改变你想要的,以符合人们的期望,从而获得使用图书馆为你获取它的好处。
然而,进一步深入这个命令行设计的兔子洞,使用 -i in1 -i in2 -i in3
会更好,但仍然不惯用且笨拙。通常的规则是通过 no-switch 进行输入。编写命令行的正确方法是:
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);
}
}
我了解如何直接解析命令行字符串以及使用 args4j 的选项。但我找不到如何将多个参数解析为单个选项。我的意思是这样的命令行:
java -jar myprog.jar -i firstFile secondFile thirdFile -o outputFile
所以基本上我想为输入选项传递未定义数量的参数。 谢谢
args4j 不能那样做,我想。我不会使用 args4j,它已经过时了。
尝试jcommander。这是完全相同的想法,但与 args4j 不同的是,您可以将 jcommander take on @Option
粘贴到 List<T>
上。请参阅文档的第 2.2 节(单击 link,转到 2.2。:P)
然而:请注意,如果我从字面上理解你的问题,那么你的问题是非常不可取的!
在 posix-style 命令行参数中,您的字符串被解析为:
-i firstFile
- 好的,firstFile 是 -i 选项的参数。secondFile
- 好的,这与 -i 完全无关,这是一个文件参数。thirdFile
- 同样的交易。-o outFile
- outFile 是 -o 开关的参数值。
您可能想要的以及 jcommander 的工作方式是您必须编写:
java -jar myprog.jar -i firstFile -i secondFile -i thirdFile -o outFile
如果你真的想让 -i firstFile secondFile thirdFile
工作,那有点奇怪 / non-standard,自然地,当你想要非标准的东西时,标准库不太可能为你提供,所以你必须全部手写。我建议你.. 稍微改变你想要的,以符合人们的期望,从而获得使用图书馆为你获取它的好处。
然而,进一步深入这个命令行设计的兔子洞,使用 -i in1 -i in2 -i in3
会更好,但仍然不惯用且笨拙。通常的规则是通过 no-switch 进行输入。编写命令行的正确方法是:
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);
}
}