我目前正在使用该库Apache Commons CLI 1.3.1来解析命令行参数并控制可执行 jar 中的执行流程。到目前为止,一切都非常简单,文档和示例使用页面也相对全面且有用。
但是,我仍然不清楚如何使用这个库来检测是否存在任何参数或选项。我想检测这种情况,然后打印使用/帮助声明。我通过简单地检查参数数组的长度来解决这个问题,但我想知道库是否有一种方法可以在不检查每个选项是否存在的情况下检测这种情况。
这是我的代码,其中包含解决方法:
public static void main(String[] args)
{
try
{
// create Options object
Options options = new Options();
// add t option
options.addOption("t", false, "display current time");
options.addOption("help", false, "print this message");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("t")) {
log.debug("Received option t");
// Do something
}
if (args.length <= 0 || cmd.hasOption("help"))
{
// automatically generate the help statement
HelpFormatter formatter = …Run Code Online (Sandbox Code Playgroud) 可以在 Apache Commons CLI 中检索位置参数。是否可以为使用声明命名它们?具体来说,Apache Commons CLI 文档给出了一个 ls 示例:
Usage: ls [OPTION]... [FILE]...
Run Code Online (Sandbox Code Playgroud)
调用时如何使用 HelpFormatter 输出“[FILE]...” HelpFormatter.printHelp(..., autoUsage = true)?这些是返回的值CommandLine.getArgs()。我知道如何Option在使用消息中命名参数,但不知道如何命名此类位置参数。
我知道,下面的代码将生成帮助文本并将其打印到控制台
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("myapp", header, options, footer, true);
Run Code Online (Sandbox Code Playgroud)
但我如何获取帮助文本作为String对象。我期待类似的事情
formatter.getHelp("myapp", header, options, footer, true);
Run Code Online (Sandbox Code Playgroud)
API中是否隐藏了任何方法CLI?或者有什么方法可以获取帮助文本而不是将其打印到控制台。
我在我们的代码库中找到了一个命令行实用程序,其中作者编写了一个自制的命令行解析器,其中包含的代码比实用程序本身更多.我决定将它切换到使用Apache CLI,事情几乎正常.
该实用程序使用尾随args,所以它看起来像这样:
util --argA=1 --argB=2 foo blah blarg
Run Code Online (Sandbox Code Playgroud)
其中"foo","blah"和"blarg"用作参数.
有办法处理这种情况吗?我宁愿不(并且可能没有权力)更改此实用程序的命令行签名.
java command-line-interface apache-commons apache-commons-cli
我希望能够有以下形式的参数:
./mything -arg1 hey -arg2 ho filename
Run Code Online (Sandbox Code Playgroud)
所以一个可选的 arg1,一个可选的 arg2,然后是一个未命名的最后一个参数。我想知道是否有办法用 Apache CLI 做到这一点?我可以把它从参数中抓取到 main,但这看起来很笨拙。
感谢任何帮助。
我正在尝试使用 OptionBuilder.withArgName( "property=value" )
如果我的选项被称为状态,我的命令行是:
--status p=11 s=22
Run Code Online (Sandbox Code Playgroud)
它只能成功识别第一个参数11,它无法识别第二个参数......
Option status = OptionBuilder.withLongOpt("status")
.withArgName( "property=value" )
.hasArgs(2)
.withValueSeparator()
.withDescription("Get the status")
.create('s');
options.addOption(status);
Run Code Online (Sandbox Code Playgroud)
提前感谢您的帮助
我正在使用 Apache Commons CLI 1.2 来解析最后带有选项和额外参数的命令行。前任:mycmd -d DIR extra stuff
我知道如何使用 获取“额外”和“东西” CommandLine.getArgs(),但我不知道如何在帮助输出中显示这些额外参数。当我拨打这样的电话时:
new HelpFormatter().printHelp("mycmd", opts, true);
Run Code Online (Sandbox Code Playgroud)
我得到的输出如下:
usage: mycmd -d DIR
Run Code Online (Sandbox Code Playgroud)
没有额外的参数。有人能指出我正确的方向吗?
我目前正在使用 Apache 的通用 CLI 库来解析命令行选项,我想知道是否有一种简单的方法来满足条件要求。
例如,在下面的示例中,我有两个必需选项-a和-b一个可选选项-h,其中应显示一些描述。解析器现在的工作方式是,只要缺少必需的选项之一,它就会抛出 ParserException。到目前为止,一切都很好。-h我的问题是是否有一种方法可以在指定时不查找所需的选项。由于这种情况很常见,-h只应打印帮助而不实际启动我的应用程序,因此我想跳过检查其他命令行选项。
import org.apache.commons.cli.*;
public class MyClass {
...
public static void main(String[] parameters)
{
Options options = new Options();
Option opt_a = Option.builder("a")
.argName("A Option")
.required(true)
.longOpt("a-option")
.desc("First option")
.build();
Option opt_b = Option.builder("b")
.argName("B Option")
.required(true)
.longOpt("b-option")
.desc("Second option")
.build();
Option opt_h = Option.builder("h")
.argName("Help")
.longOpt("help")
.desc("Shows this help")
.build();
options.addOption(opt_a);
options.addOption(opt_b);
options.addOption(opt_h);
CommandLineParser parser = new DefaultParser();
try {
CommandLine cmd = …Run Code Online (Sandbox Code Playgroud) Apache Commons Command Line Interface 1.3.1 尝试从这里使用 它对于必需的参数工作正常,但似乎删除了任何可选参数。有人能发现我下面的代码有问题吗?
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class TestCommandLine {
public static void main(String[] args) {
// ***** test with command line arguments -R myfirstarg -O mysecondarg *****
// ***** the second arg is not being captured *****
System.out.println("Number of Arguments : " + args.length);
String commandline = "";
for (String arg : args) {
commandline = commandline + (arg + " ");
}
commandline.trim(); …Run Code Online (Sandbox Code Playgroud) 我正在使用 apache-commons-cli 来解析我的 java 程序中的命令行参数。
现在,我正在尝试找到一种方法来从使用帮助中排除显示一些敏感或调试选项。顺便说一句,我正在使用它来寻求帮助。HelpFormatter
Option first = Option.builder("f").hasArg().desc("First argument").build();
Option second = Option.builder("s").hasArg().desc("Second argument").build();
Option debug = Option.builder("d").hasArg().desc("Debug argument. Shouldn't be displayed in help").build();
commandOptions.addOption(first).addOption(second).addOption(debug);
HelpFormatter help = new HelpFormatter();
help.printHelp("Test App", commandOptions);
Run Code Online (Sandbox Code Playgroud)
这是打印所有选项。但我不想打印第三个选项。
实际输出:
usage: Test App
-d <arg> Debug argument. Shouldn't be displayed in help // This shouldn't be displayed.
-f <arg> First argument
-s <arg> Second argument
Run Code Online (Sandbox Code Playgroud)
预期输出:
usage: Test App
-f <arg> First argument
-s <arg> Second argument …Run Code Online (Sandbox Code Playgroud)