标签: apache-commons-cli

Commons CLI中不带选项名称的必选参数

我正在尝试将Java中的命令行参数解析为以下用法:

Usage: gibl FILE
 -h,  --help      Displays this help message.
 -v,  --version   Displays the program version.
 FILE             Source file.
Run Code Online (Sandbox Code Playgroud)

使用Apache Commons CLI库,我知道我可以选择使用Option来解析-h-v命令,然后使用CommandLine.getArgs()来获取剩余的参数FILE,然后根据需要进行解析,但实际上我想将其指定为OptionCLI中的一个。

目前,我执行以下操作:

if (cmd.getArgs().length < 1) {
    System.out.println("Missing argument: FILE");
    help(1); // Prints the help file and closes the program with an exit code of 1.
}
String file = cmd.getArgs()[0];
Run Code Online (Sandbox Code Playgroud)

但是,当我调用HelpFormatter.printHelp(String, Options)我的额外参数时,它不会包含在自动生成的帮助文本中。

我所追求的是这样的:

Option file = new Option("Source file.");
file.setRequired(true);
options.addOption(file);
Run Code Online (Sandbox Code Playgroud)

我有一个参数,但没有附加相应的选项标识符的地方,因此可以将其传递给 …

java apache-commons-cli

7
推荐指数
2
解决办法
3293
查看次数

如何使用apache commons cli指定多个选项?

我想要的东西:

java programName  -jobs1 -C 10 -W 20
java programName  -job2
java programName  -job3
Run Code Online (Sandbox Code Playgroud)

内容:

Option o1 = new Option("job2", "some desc");
Option o2 = new Option("job3" , "(some desc")

Option o3 = OptionBuilder.hasArgs(2).withArgName( "W" ).withArgName("C").withDescription(  "Some desc" ).create("job1")
Option o4 = new Option("help");

Options os = new Options().addOption(o1).addOption(o2).addOption(o3).addOption(o4).

HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "ProgramName", options );
Run Code Online (Sandbox Code Playgroud)

...输出的位置是:

Usage ProgramName
 -job1 <c>  Some Desc
 -job2      Some desc
 -job3      Some desc
 -help      Print this message
Run Code Online (Sandbox Code Playgroud)

我希望-job1它应该打印-job1 -C …

java apache-commons-cli

6
推荐指数
1
解决办法
2万
查看次数

仅在Apache Commons CLI中需要一个参数?

我只是想知道Apache Commons CLI库中是否有任何方法可以指定必须提供一个参数?

例如,我有2个命令行参数,但必须提供一个(不多或不少)?我想要ip或msisdn,但不是两者都不是,而不是两者:

OptionBuilder.hasArg(true);
OptionBuilder.withDescription("Bla bla");
OptionBuilder.isRequired(false);
commandLineOptions.addOption(OptionBuilder.create("ip"));

OptionBuilder.hasArg(true);
OptionBuilder.withDescription("Bla bla");
OptionBuilder.isRequired(false);
commandLineOptions.addOption(OptionBuilder.create("msisdn"));
Run Code Online (Sandbox Code Playgroud)

非常感谢!

java apache-commons apache-commons-cli

6
推荐指数
1
解决办法
2296
查看次数

我可以在Apache Commons CLI中用连字符创建选项名称吗?

我正在尝试使用Apache Commons CLI Java库在“名称”中设置选项名称,例如“源文件”。

Option option = new Option("source-files", true, "List of source files")
Run Code Online (Sandbox Code Playgroud)

我得到这个错误,

java.lang.IllegalArgumentException: opt contains illegal character value '-'
at org.apache.commons.cli.OptionValidator.validateOption(OptionValidator.java:73)
at org.apache.commons.cli.Option.<init>(Option.java:123)
at org.apache.commons.cli.Option.<init>(Option.java:105)
Run Code Online (Sandbox Code Playgroud)

这意味着我不能在选项名称中使用连字符,这是unix命令的标准名称。我注意到Commons CLI文档在其示例中提到了带连字符的选项名称。我在这里想念什么吗?

java apache-commons-cli

6
推荐指数
1
解决办法
1344
查看次数

Hadoop NoSuchMethodError apache.commons.cli

我正在使用,hadoop-2.7.2并且使用IntelliJ做过MapReduceJob。在我的工作中,我正在使用apache.commons.cli-1.3.1,并将lib放入了jar中。

在Hadoop集群上使用MapReduceJob时,我有一个NoSuchMethodError

线程“主”中的异常java.lang.NoSuchMethodError:org.apache.commons.cli.Option.builder(Ljava / lang / String;)Lorg / apache / commons / cli / Option $ Builder;

我不明白,因为该方法存在于类中Option,并且该类Option从中提取commons-cli.jar到我的应用程序jar中。而且,我的其他库没有这个问题。

感谢您的时间。

java hadoop nosuchmethoderror apache-commons-cli

6
推荐指数
2
解决办法
3154
查看次数

Scala错误编译OptionBuilder

我正在使用Apache commons cli(1.2)进行命令行解析.

我的代码中有以下内容:

import org.apache.commons.cli.OptionBuilder
OptionBuilder.withLongOpt("db-host").hasArg.
withDescription("Name of the database host").create('h')
Run Code Online (Sandbox Code Playgroud)

我收到了错误hasArg is not a member of org.apache.commons.cli.OptionBuilder.这没有什么区别,如果我改变.hasArg.hasArg().

为什么?

BTW,Java解析这个问题.

parsing scala apache-commons-cli

5
推荐指数
1
解决办法
1177
查看次数

如何让Apache CLI处理双击?

我查看了文档,但看不到如何让Apache Commons CLI处理通常终止选项处理的双连字符"选项".

请考虑以下命令行,该命令行具有"-opt"选项,该选项可以采用未指定的可选参数:

MyProgram -opt -- param1 param2
Run Code Online (Sandbox Code Playgroud)

我希望选项在这种情况下最终没有参数,但Apache返回" - "作为参数.如果该选项允许多个参数,那么部分或全部参数将作为参数返回.

以下是说明问题的示例代码:

package com.lifetouch.commons.cli;

import java.util.Arrays;
import org.apache.commons.cli.*;

public class DoubleHyphen {
  private static Options options = new Options();

  public static void main(String args[]) {
    // One required option with an optional argument:
    @SuppressWarnings("static-access")
    OptionBuilder builder = OptionBuilder.isRequired(true).
            withDescription("one optional arg").
            withArgName("optArg").hasOptionalArgs(1);
    options.addOption(builder.create("opt"));

    // Illustrate the issue:
    doCliTest(new String[] { "-opt"} );
    doCliTest(new String[] { "-opt", "optArg", "param"} );
    doCliTest(new String[] { "-opt", "--", "param"} );
    // What I …
Run Code Online (Sandbox Code Playgroud)

java command-line-interface apache-commons apache-commons-cli

5
推荐指数
1
解决办法
3393
查看次数

ClassNotFoundException:带有maven的org.apache.commons.cli.ParseException

我试图从linux中的命令行运行一个java项目:

$ java -jar target/my-app.jar -csv test.csv

并得到了这个错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
    at java.lang.Class.getMethod0(Class.java:2774)
    at java.lang.Class.getMethod(Class.java:1663)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
Run Code Online (Sandbox Code Playgroud)

我正在使用maven-3,这里是我的构建maven配置:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>${appClass}</mainClass>
                            <classpathPrefix>lib/</classpathPrefix>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
Run Code Online (Sandbox Code Playgroud)

而我的commons-cli依赖声明

        <!-- CLI -->
        <dependency>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.2</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

如果我将代码和依赖项删除到我的类中,我就不会再出错了.

谢谢 !

java maven apache-commons-cli

5
推荐指数
1
解决办法
1万
查看次数

调用CommandLineParser#parser时使用org.apache.commons.cli的java.lang.IllegalAccessError

我正在尝试使用Apache Commons CLI库来解析Eclipse项目中的命令行选项,大致遵循其使用场景中的示例

我将该commons-cli-1.3.1文件夹添加到libEclipse项目根目录中的文件夹中.

我把它添加到我的导入中:

import org.apache.commons.cli.*;
Run Code Online (Sandbox Code Playgroud)

这是我的首要问题main:

    Options options = new Options();
    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = null;
    try {
        cmd = parser.parse( options, args);
    } catch ( ParseException e1 ) {
        System.err.println( "Unable to parse command-line options: "+e1.getMessage() );
        e1.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

它编译时没有错误,但是当它运行时,parser.parse调用会生成此错误:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.apache.commons.cli.Options.getOptionGroups()Ljava/util/Collection; from class org.apache.commons.cli.DefaultParser
Run Code Online (Sandbox Code Playgroud)

此时我没有使用任何类加载器.

这个错误是什么意思?如何解决错误并解析参数?

java eclipse apache-commons-cli

5
推荐指数
2
解决办法
2365
查看次数

使用帮助参数时覆盖 required() 参数

我通过以下方式添加解析器选项:

options = new Options()
                .addOption(Option.builder(CONFIG_PARAM)
                        .required()
                        .hasArg(true)
                        .argName(CONFIG_PARAM_NAME + "_path")
                        .desc(CONFIG_PARAM_DESC)
                        .longOpt(CONFIG_PARAM_NAME)
                        .build())
                (...)
                .addOption(Option.builder(HELP_PARAM)
                        .hasArg(false)
                        .longOpt(HELP_PARAM_NAME)
                        .desc(HELP_PARAM_DESC)
                        .build());
Run Code Online (Sandbox Code Playgroud)

现在,我想允许用户仅使用帮助命令,例如。

mypreciousapp --help
Run Code Online (Sandbox Code Playgroud)

使用上述解决方案,这是不可能的 - 我收到有关缺少所需参数的信息

Missing required options: c
Run Code Online (Sandbox Code Playgroud)

有什么方法可以标记帮助参数,以便它可以覆盖所需的参数,并允许单独使用它?我可以手动执行此操作,但首先我想知道 CLI 库中是否有这样的选项。

java command-line-interface apache-commons apache-commons-cli

5
推荐指数
1
解决办法
1120
查看次数