Commons CLI 不支持我的命令行设置
Commons CLI is not honoring my command line setup
这里使用Apache Commons CLI 1.2。我有一个可执行 JAR,它需要 2 个 运行 时间选项,fizz
和 buzz
;两者都是需要 arguments/values 的字符串。我会喜欢(如果可能的话)我的应用程序像这样执行:
java -jar myapp.jar -fizz "Alrighty, then!" -buzz "Take care now, bye bye then!"
在这种情况下,fizz
选项的值将是“好吧,那么!”等
这是我的代码:
public class MyApp {
private Options cmdLineOpts = new Options();
private CommandLineParser cmdLineParser = new GnuParser();
private HelpFormatter helpFormatter = new HelpFormatter();
public static void main(String[] args) {
MyApp myapp = new MyApp();
myapp.processArgs(args);
}
private void processArgs(String[] args) {
Option fizzOpt = OptionBuilder
.withArgName("fizz")
.withLongOpt("fizz")
.hasArg()
.withDescription("The fizz argument.")
.create("fizz");
Option buzzOpt = OptionBuilder
.withArgName("buzz")
.withLongOpt("buzz")
.hasArg()
.withDescription("The buzz argument.")
.create("buzz");
cmdLineOpts.addOption(fizzOpt);
cmdLineOpts.addOption(buzzOpt);
CommandLine cmdLine;
try {
cmdLine = cmdLineParser.parse(cmdLineOpts, args);
// Expecting to get a value of "Alright, then!"
String fizz = cmdLine.getOptionValue("fizz");
System.out.println("Fizz is: " + fizz);
} catch(ParseException parseExc) {
helpFormatter.printHelp("myapp", cmdLineOpts, true);
throw parseExc;
}
}
}
当我 运行 时,我得到以下输出:
Fizz is: null
我需要对我的代码做些什么,才能按照我想要的方式调用我的应用程序?或者我最接近它的是什么?
奖励积分: 如果有人能向我解释 OptionBuilder
的 withArgName(...)
、withLongOpt(...)
和 [=18 之间的区别=] 参数,因为我为它们传递了相同的值,如下所示:
Option fizzOpt = OptionBuilder
.withArgName("fizz")
.withLongOpt("fizz") } Why do I have to pass the same value in 3 times to make this work?!?
.create("fizz");
首先,您的 OptionBuilder 上的 .hasArg()
告诉它您希望在参数标志之后有一个参数。
我让它与这个命令行一起工作
--fizz "VicFizz is good for you" -b "VicBuzz is also good for you"
使用下面的代码——我把它放在构造函数中
Option fizzOpt = OptionBuilder
.withArgName("Fizz")
.withLongOpt("fizz")
.hasArg()
.withDescription("The Fizz Option")
.create("f");
cmdLineOpts.addOption(fizzOpt);
cmdLineOpts.addOption("b", true, "The Buzz Option");
细分
选项设置是必要的,以便在命令行上提供更多的可用性,以及一个很好的用法消息(见下文)
.withArgName("Fizz")
:在用法中给你的论点一个漂亮的标题
(见下文)
.withLongOpt("fizz")
:允许 --fizz "VicFizz is good for you"
.create("f")
:是主要参数,允许
命令行 -f "VicFizz is good for you"
- 注意选项 b
fuzz 的构造要简单得多,但会牺牲可读性
用法
用法留言
就我个人而言,我喜欢打印出很好用法的 CLI 程序。您可以使用 HelpFormatter
执行此操作。例如:
private void processArgs(String[] args) {
if (args == null || args.length == ) {
helpFormatter.printHelp("Don't you know how to call the Fizz", cmdLineOpts);
...
这将打印一些有用的东西,例如:
usage: Don't you know how to call the Fizz
-b <arg> The Buzz Option
-f,--fizz <Fizz> The Fizz Option
注意短选项 -f
、长选项 --fizz
和名称 <Fizz>
以及描述是如何显示的。
希望对您有所帮助
这里使用Apache Commons CLI 1.2。我有一个可执行 JAR,它需要 2 个 运行 时间选项,fizz
和 buzz
;两者都是需要 arguments/values 的字符串。我会喜欢(如果可能的话)我的应用程序像这样执行:
java -jar myapp.jar -fizz "Alrighty, then!" -buzz "Take care now, bye bye then!"
在这种情况下,fizz
选项的值将是“好吧,那么!”等
这是我的代码:
public class MyApp {
private Options cmdLineOpts = new Options();
private CommandLineParser cmdLineParser = new GnuParser();
private HelpFormatter helpFormatter = new HelpFormatter();
public static void main(String[] args) {
MyApp myapp = new MyApp();
myapp.processArgs(args);
}
private void processArgs(String[] args) {
Option fizzOpt = OptionBuilder
.withArgName("fizz")
.withLongOpt("fizz")
.hasArg()
.withDescription("The fizz argument.")
.create("fizz");
Option buzzOpt = OptionBuilder
.withArgName("buzz")
.withLongOpt("buzz")
.hasArg()
.withDescription("The buzz argument.")
.create("buzz");
cmdLineOpts.addOption(fizzOpt);
cmdLineOpts.addOption(buzzOpt);
CommandLine cmdLine;
try {
cmdLine = cmdLineParser.parse(cmdLineOpts, args);
// Expecting to get a value of "Alright, then!"
String fizz = cmdLine.getOptionValue("fizz");
System.out.println("Fizz is: " + fizz);
} catch(ParseException parseExc) {
helpFormatter.printHelp("myapp", cmdLineOpts, true);
throw parseExc;
}
}
}
当我 运行 时,我得到以下输出:
Fizz is: null
我需要对我的代码做些什么,才能按照我想要的方式调用我的应用程序?或者我最接近它的是什么?
奖励积分: 如果有人能向我解释 OptionBuilder
的 withArgName(...)
、withLongOpt(...)
和 [=18 之间的区别=] 参数,因为我为它们传递了相同的值,如下所示:
Option fizzOpt = OptionBuilder
.withArgName("fizz")
.withLongOpt("fizz") } Why do I have to pass the same value in 3 times to make this work?!?
.create("fizz");
首先,您的 OptionBuilder 上的 .hasArg()
告诉它您希望在参数标志之后有一个参数。
我让它与这个命令行一起工作
--fizz "VicFizz is good for you" -b "VicBuzz is also good for you"
使用下面的代码——我把它放在构造函数中
Option fizzOpt = OptionBuilder
.withArgName("Fizz")
.withLongOpt("fizz")
.hasArg()
.withDescription("The Fizz Option")
.create("f");
cmdLineOpts.addOption(fizzOpt);
cmdLineOpts.addOption("b", true, "The Buzz Option");
细分
选项设置是必要的,以便在命令行上提供更多的可用性,以及一个很好的用法消息(见下文)
.withArgName("Fizz")
:在用法中给你的论点一个漂亮的标题 (见下文).withLongOpt("fizz")
:允许--fizz "VicFizz is good for you"
.create("f")
:是主要参数,允许 命令行-f "VicFizz is good for you"
- 注意选项 b fuzz 的构造要简单得多,但会牺牲可读性 用法
用法留言
就我个人而言,我喜欢打印出很好用法的 CLI 程序。您可以使用 HelpFormatter
执行此操作。例如:
private void processArgs(String[] args) {
if (args == null || args.length == ) {
helpFormatter.printHelp("Don't you know how to call the Fizz", cmdLineOpts);
...
这将打印一些有用的东西,例如:
usage: Don't you know how to call the Fizz
-b <arg> The Buzz Option
-f,--fizz <Fizz> The Fizz Option
注意短选项 -f
、长选项 --fizz
和名称 <Fizz>
以及描述是如何显示的。
希望对您有所帮助