我正在尝试将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 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 …
我只是想知道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)
非常感谢!
我正在尝试使用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文档在其示例中提到了带连字符的选项名称。我在这里想念什么吗?
我正在使用,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中。而且,我的其他库没有这个问题。
感谢您的时间。
我正在使用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解析这个问题.
我查看了文档,但看不到如何让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
我试图从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)
如果我将代码和依赖项删除到我的类中,我就不会再出错了.
谢谢 !
我正在尝试使用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)
此时我没有使用任何类加载器.
这个错误是什么意思?如何解决错误并解析参数?
我通过以下方式添加解析器选项:
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