【问题标题】:Why doesn't picocli recognize my option from the command line?为什么 picocli 不能从命令行识别我的选项?
【发布时间】:2020-07-18 00:00:16
【问题描述】:

我正在尝试使用 PICOCLI 在 Java 中构建 CLI,但我在一个非常基本的点上遇到了困难。我根本无法将我的应用程序提供给消费者一个选项和它的价值。这是我的课:

package com.example.demo;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import picocli.CommandLine;

@SpringBootApplication

@CommandLine.Command(name = "Greet", header = "%n@|green Hello world demo|@")
class DemoApplication implements Runnable {

    @CommandLine.Option(names = {"-u", "--user"}, required = true, description = "The user name.")
    String userName;

    public void run() {
        System.out.println("Hello, " + userName);
    }

    public static void main(String... args) {
        CommandLine.run(new DemoApplication(), System.err, args);
    }
}

然后我做了一个mvn packagecd targetjava -jar demo-1.0.jar Greet -u pico,但我只遇到了这个:

Unmatched argument at index 0: 'Greet'

Hello world demo
Usage: Greet -u=<userName>
  -u, --user=<userName>   The user name.

我已经没有耐心尝试打印一条简单的消息了!我不知道如何解决这个问题。请帮忙!

【问题讨论】:

    标签: java command-line-interface picocli


    【解决方案1】:

    如果使用java调用命令,则无需指定命令名称Greet,只需指定命令行选项即可:

    java -jar demo-1.0.jar -u pico
    

    你可以这样想:java -jar demo-1.0.jar Greet 命令。

    您可能希望使用Application Assembler Maven Plugin 创建启动器脚本,并将该启动器脚本命名为Greet

    这样,您的程序的用户可以在命令行中使用以下命令调用它:

    Greet -u pico
    

    AppAssembler 的 maven 配置应如下所示:

    <project>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.10</version>
            <configuration>
              <programs>
                <program>
                  <mainClass>com.example.demo.DemoApplication</mainClass>
                  <id>Greet</id>
                </program>
              </programs>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    更新:我在how to run picocli-based applications 的用户手册中添加了一个部分。


    更新 2:我建议升级到最新版本的 picocli; 4.0 版引入了新的execute API,更好地支持退出代码和错误处理。

    在您的示例中,如下所示:

    
    public static void main(String... args) {
      int exitCode = new CommandLine(new DemoApplication()).execute(args);
      System.exit(exitCode);
    }
    

    【讨论】:

    • 非常感谢您!我不知道为什么“问候”不起作用!这非常有帮助!谢谢你:)?
    • 感谢您提出这个问题!它启发了我改进手册并添加关于如何运行基于 picocli 的应用程序的新部分,以及重新阅读手册的包装部分。 :thumbs-up:
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多